进程定义:
1.一个任务就是一个进程,进程是系统中的程序执行和资源分配的基本单位。
2.每个进程都各自独立有自己的数据段(自己的数据),代码段(自己的代码)、和堆栈段。
3.在创建子进程时对全局变量做了一个备份父进程与子进程的num两个不同的变量。
4.父进程的num是父进程的堆栈定义,子进程的num是子进程的堆栈定义。
5.由于计算机是4核,子进程1~4会同时进行,高于4个任务电脑随机分配给其他CPU工作。
multiprocessing.cpu_count() 统计CPU
multiprocessing.active_children() 创建进程后查看多少进程
一、初始化进程对象
from multiprocessing import Process
target 进程目标 即 def fun: #创建的一个函数,即我们所执行的子进程 target!=fun() 否则target代表的就是函数的返回值
args 参数(元祖)
name 进程名字,可选
p = Process(target=fun,args=('',),name='') 创建进程对象,通常需要在args参数后加一个逗号,因为是元组类型。
os.getpid() | 获取当前进程的ID |
os.getppid() | 获取当前的进程的父(主)进程的ID |
p.daemon = True | 守护进程后台运行,默认Flase,要通过start()设置 |
p.pid | 进程ID |
p.name | 进程名字 |
p.terminate() | 强行终止进程 |
p.is_alive() | p.is_alive() |
二、父(主)和子进程的运行顺序
p.start() 启动进程
p.join() 阻塞进程 直到调用此方法的进程终止才运行后面进程
(如果没有p.join(),父(主)和子进程的顺序就是,先执行父进程,执行完毕之后在执行,子进程的程序,即父进程的结束不影响子进程,有的话,会先启动父(主)进程,然后启动、结束子进程,最后结束父(主)进程,即父进程等待所有子进程执行完毕之后在结束)
三、全局变量不能够在多个进程中共享:
在子进程修改全局变量,对父进程中的全局变量没有影响
因为在创建子进程的同时对全局变量做了备份,父进程中的与子进程中的num(全局变量)是两个完全不同的变量,意思就是全局变量仅仅实在父进程中是全局变量供给使用
四、启动大量子进程
from multiprocessing import Pool
def run:
………
if __name__==’__main__’:
#创建Pool进程池,默认是cpu核心数,高于CPU核心数效率增大,例子中( ,4>2)
Pp = Pool(2)
For i in range(4):
#创建进程,放入进程池统一管理
Pp.apply_async(run,ards=(‘ ‘,)
#子进程的执行是没有顺序的,是操作系统控制的
Pp.close()
Pp.join()
p = Pool(target='',args=(''),name='')
p.map(get_infor,urls) #map()函数是将urls中每个元素到放入到get_infor中执行一遍
p.apply() #同步进程池
p.apply_async() #异步进程池
p.close() #关闭进程池,阻止更多任务提交到进程池
(在调用join之前必须先调用close,调用close之后就不能在添加新的进程了)
p.join() #阻塞进程 调用join前必须调用close
(进程池对象调用join,会等待进程池中所有的子进程借宿完毕再去执行)
五、进程间的通信
from multiprocessing import Process,Queue
#Queue把运算结果放在队列中,所有运算完后取出他,继续加载运算
Def write(q): #往队列里面写数据
For value in [‘a’,’b’]:
q.put(value) #将value放置队列中
Def read(q):#从队列里面读取数据
While True:
#一直读取数据,不知道队列中有多少数据
Value= q.get(True) #从队列中获取值
Print(“value=”+value)
If __name__==’__name__’:
#父进程创建队列,并传递给子进程
q = Queue() #初始化队列对象
#创建2个子进程
Pw = Process(target=write,args(q,)) #q是队列
Pr = Process(target=read,args(q,))
Pw.start()
Pr.start()
Pw.join() #等代pw这个子进程结束
#但是pr子进程里面是死循环,所有只能强制性结束该进程
Pr.terminnate()