复习
# 信号量 from multiprocessing import Semaphore # 用锁的原理实现的,内置了一个计数器 # 在同一个事件,只能有指定数量的进程执行某一段被控制住的代码 # 事件 # wait阻塞受到事件控制的同步组件 # 状态 True Flase is_set # true--》false 用clear() # false --->true 用set() # wait方法 状态为true不阻塞 状态为false的时候阻塞 # 队列 # Queue # put 当队列满的时候阻塞等待队列有空位置 # get 当队列空的时候阻塞等待队列有数据 # full empty 不完全准确 # JoinableQuere # task_done 与get连用 # join 与put连用
管道
from multiprocessing import Pipe,Process def func(conn1,conn2): conn2.close() while True: try: msg = conn1.recv() print(msg) except EOFError: conn1.close() break if __name__ == '__main__': conn1,conn2 = Pipe() Process(target=func,args=(conn1,conn2)).start() conn1.close() for i in range(20): conn2.send('吃了吗') conn2.close()
from multiprocessing import Pipe,Process import time,random def producer(con,pro,name,food): con.close() for i in range(4): time.sleep(random.randint(1,3)) f = '%s生产%s%s'%(name,food,i) print(f) pro.send(f) pro.close() def consumer(con,pro,name): pro.close() while True: try: food = con.recv() print('%s吃了%s'%(name,food)) time.sleep(random.randint(1,3)) except EOFError: con.close() break if __name__ == '__main__': con,pro = Pipe() p = Process(target=producer,args = (con,pro,'egon','泔水')) p.start() c = Process(target=consumer,args = (con,pro,'alex')) c.start() con.close() pro.close()
进程之间的数据共享
from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acquire() dic['count'] -= 1 lock.release() if __name__ == '__main__': m = Manager() l = Lock() dic = m.dict({'count':100}) p_list = [] for i in range(50): p = Process(target=main,args=(dic,l)) p.start() p_list.append(p) for i in p_list: i.join() print('主进程:',dic)