多进程_Multiprocessing
简单描述
所有子程单独处理,稳定性更优,性能linux和win差不多
常用类
-
class multiprocessing.Process(target,args,name)
【构造进程对象】
target传入函数名
argsTuple类型,传入函数参数
pro.start()
:启动进程
pro.join()
:等待所有进程执行完毕 -
class multiprocessing.Pool(processes)
【提供指定数量的进程池,新的请求提交时会先判断池子是否满,满了需等待】
processes默认是CPU核数
pool.close()
:调用后不能添加新的进程
pool.join()
:等待所有进程执行完毕,调用前需要先调用close()
pool.map(func,iterable,chunksize)
:根据多个参数构建进程任务并放入池
pool.apply_async(target=None,args=())
:同步执行进程,允许多个进程同时进入池子
pool.apply(target=None,args=())
:只允许一个进程进池,进程结束后才允许新进,间接让pool的value失效 -
class multiprocessing.Lock()
【进程锁】
lock.acquire()
:锁定
lock.release()
:解锁 -
class multiprocessing.Manager()
【进程间共享变量】
mg.list()
:创建list类型共享变量
mg.dict()
:创建dict类型共享变量 -
class multiprocessing.Queue()
【用来在多个进程间通信,队列数据结构,先进先出
qe.get(timeout)
:从队列中读取并删除一个元素
qe.put(data,timeout)
:插入数据到队列中
qe.close()
:关闭通道 -
class multiprocessing.Pipe()
【两个进程间通信,返回Tuple,队列数据结构,先进先出
pp.send(data)
:发出数据
pp.recv()
:接受数据
pp.close()
:关闭通道
常用函数
multiprocessing.cpu_count()
:返回环境cup数量
os.getppid()
:返回ppid,不同进程值可能相同
os.getpid()
:返回pid,不同进程值不同
example
pool.map()
# -*- coding:utf-8 -*-
import multiprocessing
import os
import time
def fun1(obj):
print('%s-%s : %s'%(os.getppid(),os.getpid(),obj['a']+obj['b']))
time.sleep(1)
if __name__=='__main__':
pool=multiprocessing.Pool(processes=2)
# 每个任务只能传入一个参数,多参数用字典代替
pool.map(func=fun1,iterable=({'a':1,'b':2},))
pool.close()
pool.join()
pool.apply_async()
# -*- coding:utf-8 -*-
import multiprocessing
import os
import time
def fun1(a,b):
print('%s-%s : %s'%(os.getppid(),os.getpid(),a+b))
time.sleep(1)
if __name__=='__main__':
pool=DummyPool(processes=2)
# 把任务加入到池
[pool.apply_async(func=fun1,args=(1,2)) for i in range(10)]
pool.close()
pool.join()
multiprocessing.Manager()
# -*- coding:utf-8 -*-
import multiprocessing
def fun1(lock,mglist):
lock.acquire()
mglist.append('fun1')
print('fun1:',mglist)
lock.release()
def fun2(lock,mglist):
lock.acquire()
mglist.append('fun2')
print('fun1:',mglist)
lock.release()
if __name__=='__main__':
lock=multiprocessing.Lock()
mg=multiprocessing.Manager()
mglist=mg.list()
pr1=multiprocessing.Process(target=fun1,args=(lock,mglist))
pr2=multiprocessing.Process(target=fun2,args=(lock,mglist))
prs=[pr1,pr2]
[pr.start() for pr in prs]
[pr.join() for pr in prs]
print('out:',mglist)
multiprocessing.Queue()
# -*- coding:utf-8 -*-
import multiprocessing
def fun1(q,a):
q.put(a)
q.put(2)
def fun2(q):
print(q.get())
print(q.get())
q.close() # 关闭后就不能读取
if __name__=='__main__':
q=multiprocessing.Queue()
pr1=multiprocessing.Process(target=fun1,args=(q,2))
pr2=multiprocessing.Process(target=fun2,args=(q,))
prs=[pr1,pr2]
[pr.start() for pr in prs]
[pr.join() for pr in prs]
multiprocessing.Pipe
# -*- coding:utf-8 -*-
import multiprocessing
def fun1(p,a):
p.send(1)
p.send(2)
def fun2(p):
print(p.recv())
print(p.recv())
p.close() # 关闭后就不能读取
if __name__=='__main__':
(p1,p2)=multiprocessing.Pipe()
pr1=multiprocessing.Process(target=fun1,args=(p1,2))
pr2=multiprocessing.Process(target=fun2,args=(p2,))
prs=[pr1,pr2]
[pr.start() for pr in prs]
[pr.join() for pr in prs]