进程间通讯
进程队列
import multiprocessing import time def foo(q): time.sleep(1) q.put(12) q.put("ss") if __name__ == '__main__': q = multiprocessing.Queue() #进程队列 #q = queue.Queue() 线程队列 p = multiprocessing.Process(target=foo,args=(q,)) #进程和线程不同,资源是不共享的,需要把进程队列传到另一进程中 p.start() print(q.get()) print(q.get())
管道
import multiprocessing def f(conn): conn.send([11,{"name":"ss"}]) response = conn.recv() print("response:",response) conn.close() print("q_ID2:", id(conn)) if __name__ == '__main__': parent_conn,child_conn = multiprocessing.Pipe() #双向管道 print("q_ID1:",id(child_conn)) p = multiprocessing.Process(target=f,args=(child_conn,)) p.start() print(parent_conn.recv()) parent_conn.send("hello") p.join()
Manager
Queue和Pipe只是实现的进程之间的数据交互,没有实现数据共享,Manager可以实现一个进程取修改另一个进程的数据
import multiprocessing def f(d,l,i): d[i]="ss" d["yy"] = 2 l.append(i) if __name__ == '__main__': with multiprocessing.Manager() as manager: d = manager.dict() #创建字典,不能直接用dict创建,需要用Manager这个是属性 l = manager.list(range(5)) p_list = [] for i in range(10): p = multiprocessing.Process(target=f,args=(d,l,i)) p.start() p_list.append(p) for s in p_list: s.join() print(d) print(l)
进程同步
import multiprocessing def f(l,num): l.acquire() print("%s hello" %num) l.release() if __name__ == '__main__': lock = multiprocessing.Lock() for i in range(10): p = multiprocessing.Process(target=f,args=(lock,i)) p.start()