并发 --- 3 管道 事件 信号量 进程池 回调函数
一.管道(多个时数据不安全) Pipe 类
(像队列一样,数据只能取走一次)
conn1,conn2 = Pipe() 建立管道
.send() 发送
.recv() 接收
二.事件(等待) Event类
名 = Event() 建立一个事件(默认状态为False)
名.set() 改变值为True
名.clear() 改变值为False
名.is_set() 查看事件的状态
名.wait() 如果状态是False 阻塞
True 不阻塞
三.信号量 Semaphore类
(进程锁时只允许串行,而信号量允许多个)
内部维护了一个计数器,acquire-1,release+1,
为0的时候,其他的进程都要在acquire之前等待
名 = Semaphore(数量)
名.acquire()
锁的代码
名.release()
四.进程池
(进程的创建和销毁是很有消耗的,影响代码执行效率)
名 = Pool(数量)
1. 名.map(函数,迭代):异步提交任务,并且传参需要可迭代类型的数据,
自带close和join功能
多进程和进程池的效率比较:
2.res = apply(f1,args=(i,)) #同步执行任务,必须等任务执行结束
才能给进程池提交下一个任务,可以直接拿到返回结果res
3.res_obj = apply_async(f1,args=(i,)) #异步提交任务,
可以直接拿到结果对象,从结果对象里面拿结果,要用get方法,
get方法会阻塞程序,没有拿到结果会一直等待
4.Close : 锁住进程池,防止有其他的新的任务在提交给进程池
Join : 等待着进程池将自己里面的任务都执行完
五.回调函数(进程池Pool类)
Apply_async(f1,args=(i,),callback=function)
#将前面f1这个任务的返回结果作为参数传给callback指定的那个function函数