突袭,进程和并发,梦见做爱

频道:最近大事件 日期: 浏览:175

咱们现已讲过了什么是线程,那今日就来学习一下什么是进程,进程(Process)是计算机中的程序关于某数据集合上的一次作业活动,是体系进行资源分配和调度的基本单位,是操作体系结构的根底。

进程是正在作业的程序的实例,简略的说便是比方咱们自己在python文件中写了一些代码,这叫做程序,而作业这个python文件的时分就叫做进程

什么是并发

那什么是并发呢,并发便是在某个时间段内,两件或两件以上的事情轮番替换运用某一资源,其意图是进步功率;

需求留意的是并发和并行的差异:

  • 并发是指两个或多个事情在同一时间距离发作,并行是指两个或许多个事情在同一时间发作;
  • 并发是在同一实体上的多个事情,并行是在不同实体上的多个事情;

multiprocess模块

Python中供给multiprocess模块完结多进程并发,咱们来看一下multiprocess模块的运用,经过一个实例来比照多线程和多进程程序作业对CPU的运用情况

import multiprocessing
import threading
def worker():
number = 0
for i in range(10000000):
number += 1
print('循环次数:{} number:{}'.format(i+1, number))
if __name__ == '__main__':
for i in range(4):
# 创立线程
threading.Thread(target=worker, name='thread worker {}'.format(i)).start()
# 创立进程
multiprocessing.Process(target=worker, name='process worker {}'.format(i)).start()

别离发动线程和进程,作业代码,检查电脑的CPU的运用率,发现多进程占用内存多,切换杂乱,CPU利用率低,多线程占用内存少,切换简略,CPU利用率高;

进程的一些目标办法

import multiprocessing
import threading
import time
def worker():
number = 0
for i in range(10000000):
number += 1
time.sleep(0.1)
print(multiprocessing.current_process().name) # 获取当时进程的称号
print('循环次数:{} number:{}'.format(i+1,number ))

if __name__ == '__main__':
for i in range(4):
process = multiprocessing.Process(target=worker, name='process worker {}'.format(i))
process.start()
print(process.pid) # 获取进程的pid
print(process.exitcode) # 获取退出状况码
print(process.name) # 获取进程称号
time.sleep(30)
print(process.terminate()) # 停止进程

  • multiprocessing支撑子进程、通讯和同享数据、履行不同方法的同步,供给了Process、Queue、Pipe、Lock等 组件;
  • 可以运用multiprocessing.Process目标来创立一个进程,该进程可以作业在Python程序内部编写的函数;
  • process模块是一个创立进程的模块,凭借这个模块,就可以完结进程的创立,有start(), run(), join()的办法;

进程并发:concurrent模块

from concurrent.futures import ProcessPoolExecutor
import requests
def fetch_url(url):
result = requests.get(url=url, )
return result.text
if __name__ == '__main__':
# 创立10个线程行列的线程池
pool = ProcessPoolExecutor(10)
# 获取使命回来目标
a = pool.submit(fetch_url, 'http://www.baidu.com')
# 取出回来的成果
x = a.result()
print(x)

也可以运用上下文办理的方法

from concurrent.futures import ProcessPoolExecutor
import requests
def fetch_url(url):
result = requests.get(url=url, )
return result.text
if __name__ == '__main__':
with ProcessPoolExecutor(max_workers=10) as pool:
a = pool.submit(fetch_url, 'http://www.9xkd.com')
print(a.result())

  • concurrent模块可以供给一个future的实例目标,实例目标供给了线程的履行器和进程的履行器;
  • submit():回来一个Future目标;
  • result():检查调用的回来成果;
  • done():假如使命成功履行或使命撤销回来True;
  • cancel():撤销使命;
  • running():假如使命正在履行回来True;
  • exception(): 获取履行抛出的反常;

看护进程完结(POSIX兼容)

  • 在linux或许unix操作体系中,看护进程(Daemon)是一种作业在后台的特别进程,它独立于操控终端而且周期 性的履行某种使命或等候处理某些发作的事情;
  • 因为在linux中,每个体系与用户进行沟通的界面称为终端,每一个从此终端开端作业的进程都会依附于这个终 端,这个终端被称为这些进程的操控终端,当操控终端被封闭的时分,相应的进程都会主动封闭;
  • 可是看护进程却能打破这种约束,它脱离于终端而且在后台作业,而且它脱离终端的意图是为了防止进程在运 行的过程中的信息在任何终端中显现而且进程也不会被任何终端所发生的终端信息所打断,它从被履行的时分 开端作业,直到整个体系封闭才退出;

看护进程完结的过程:

  • 父进程fork出子进程并exit退出;
  • 子进程调用setsid创立新会话;
  • 子进程调用体系函数chdir将根目录"/"成为子进程的作业目录;
  • 子进程调用体系函数umask将该进程的umask设置为0;
  • 子进程封闭从父进程承继的一切不需求的文件描述符;

对 os.fork( )的了解:

  • os.fork()回来两个值,一个是在当时父进程回来的,一个是在子进程中回来的;
  • 子进程回来的是0,父进程回来的是子进程的pid;
import os
pid = os.fork()
print(pid)
if pid == 0:
print("我是子进程 pid={}, parent_pid={}".format(os.getpid(), os.getppid()))
else:
print("我是父进程 pid={}, parent_pid={}".format(os.getpid(), os.getppid()))

参阅:https://www.9xkd.com/user/plan-view.html?id=1923439230