进程Manager
功能
数据同步,无需接收与传递参数,数据变化自动同步
用法
-
创建对象
-
m = multiprocessing.Manager()
-
调用方法获得特殊的数据对象
-
data = m.dict({"num": 0})
-
数据对象进行传递并可在另一进程内修改数据
注意
- 子进程要join一下,在主进程中要join一下,否则会报错
- 多个子进程同时修改数据会发生数据冲突,解决办法,加进程锁
代码
import multiprocessing
def func(data):
print("在子进程内")
data["num"] += 1
# print(data.get("num"))
print("结束子进程")
if __name__ == '__main__':
m = multiprocessing.Manager()
data = m.dict({"num": 0})
p = multiprocessing.Process(target=func, args=(data,))
p.start()
p.join()
print(data["num"])
进程池
-
创建进程池对象
- pool = multiprocessing.Pool(数量)
-
同步模式运行
- pool.apply(函数名,args=(参数,))
- 同步模式运行,代码效率低下
-
异步模式运行
-
pool.apply_async(函数名,args=(参数,))
-
异步模式运行,真异步模式,主进程不等待子进程
-
如果希望主进程等待子进程,办法如下:
-
pool.close(),让进程池对象的入口关闭,不再接收任务进来
-
pool.join(), 让进程池对象等待池子队列中的任务执行。未完成阻塞,完成后解阻塞
import multiprocessing import time def func(n): print(n) time.sleep(1) if __name__ == '__main__': p = multiprocessing.Pool(3) for i in range(10): p.apply_async(func, args=(i,)) p.close() p.join()
-
-
如果希望主进程等待子进程,另一种办法如下:
-
接收 pool.apply_async()对象
import multiprocessing import time def func(n): print(n) time.sleep(1) if __name__ == '__main__': p = multiprocessing.Pool(3) ret_list = [] for i in range(10): ret = p.apply_async(func, args=(i,)) ret_list.append(ret) for ret in ret_list: ret.get()
-
-