进程的数据共享
进程池-异步提交
进程池-同步提交
进程池-map方法
进程池-回调函数
线程的概念
python开启一个线程
进程的数据共享--Manager+Lock
# 进程间的数据通信是不安全的,应该尽量避免数据通信
# 选择进程间的安全工具来避免加锁带来的问题
# 数据共享--数据库去解决
from multiprocessing import Process,Manager,Lock def func(dct,l): with l:#不加锁共享数据会乱 dct['count']-=1 if __name__ == '__main__': l=Lock() m=Manager() dct=m.dict({'count':90}) p_lst=[] for i in range(90): p=Process(target=func,args=(dct,l)) p.start() p_lst.append(p) for i in p_lst: i.join() print(dct)
进程池
为什么要有进程池的概念?
一个进程:
开启,销毁,调度都要花费时间
如果我们去设置一个固定的进程数(计算机的cpu数),不停的在执行任务,
每个任务并行的去执行,不管进程,哪个任务执行完,后边任务紧接着跟上
就省掉了每个任务去开启进程,销毁进程,调度进程,所需要的时间,进程池完美的解决这个问题
from multiprocessing import Pool,Process import time def func(i): #没有IO操作 i+i if __name__ == '__main__': start = time.time() """利用进程池去执行20个任务""" p = Pool() for i in range(20): p.apply_async(func=func,args=(i,)) p.close()#关闭进程池,防止继续操作 p.join()#等待所有进程池执行完任务后,只能在close和terminate后使用 print('pool:', time.time() - start) p_lst=[] start1=time.time() for i in range(20): """利用20个进程分别执行任务""" p=Process(target=func,args=(i,)) p.start() p_lst.append(p) for p in p_lst: p.join() print('process:',time.time()-start) # 运行结果 # pool: 0.9140844345092773 # process: 4.7408812046051025
主要方法: 1.apply_async#异步调用 2.apply#同步调用 3.close()#关闭进程池,防止继续操作 4.join()#在进程池执行完所有任务,在close()terminatef()后面使用
可以取到返回值,
get()
同步直接是返回值
异步需要get()