W10_Pipe_Manager數據共享_進程池和回調函數
阿新 • • 發佈:2018-09-19
send 進程 tip 管道 error: 數量 %d brush for
[TOC] #管道 ``` from multiprocessing import Pipe,Process def func(conn2): print(conn2.recv()) conn1,conn2 = Pipe() conn1.send("Hello pipe") p = Process(target=func, args=(conn2,)) p.start() ``` **多進程中管道異常EOFError** ``` from multiprocessing import Pipe, Process import time import random def func_recv(conn1, conn2): conn2.close() while True: try: print(conn1.recv()) time.sleep(random.random()) except EOFError: conn1.close() print("recv done") break def func_send(conn1, conn2): conn1.close() for i in range(4): conn2.send("msg %d" % i) conn2.close() conn1, conn2 = Pipe() recv_p = Process(target=func_recv, args=(conn1, conn2)) send_p = Process(target=func_send, args=(conn1, conn2)) recv_p.start() send_p.start() conn1.close() conn2.close() ``` 註意:多進程使用管道可能會出現數據不安全,需要加鎖操作 [返回頂部](#top) #進程間的數據共享 ``` from multiprocessing import Manager ``` #進程池和回調函數 ##1.為什麽會有進程池的概念 效率; 每開啟進程,開啟屬於這個進程的內存空間(如寄存器,堆棧,文件都會戰用內存空間); 進程過多,操作系統調試較為耗時 ##2.進程池原理: python中先創建一個屬於進程的池子,這個池子指定能存放多少進程,任務存放於隊列,等待進程池中的進程處理,當一個進程處理完一個任務後,並不銷毀,而是放回進程池,然後繼續去任務隊列中拿取下一個任務,這就節省了進程被銷毀和再創建的時間,也節省了過多進程調度的時間; 信號量與之相比,只是節省了調度時間,因為信號裏是控制進程執行的數量,並不能控制進程創建的數量。 ``` ```
W10_Pipe_Manager數據共享_進程池和回調函數