進程通信
方式一、共享內存(進程安全,效率高)
共享變量:multiprocessing.Value
共享數組:multiprocessing.Array
方式二、Manager對象:
Mananger 包括:list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value, Array
Manager對象,相對於共享內存,更加靈活,支持Python對象,可以通過網絡進行共享,但是效率低
進程同步
Manager對象:Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event
1、簡單同步機制鎖 Lock、RLock(A/B 進程同時修改一個對象,RLock支持嵌套)
2、可控制進程數量 Semaphore, BoundedSemaphore (例如連接池限制)
3、複雜同步條件變量 Condition (A/B進程可以多條件判斷,交替執行)
4、事件控制 Event(A、C進程等待B進程執行某種操作之後才能執行)
進程池
multiprocessing.Pool
res = pool.apply_async (非阻塞)
res = pool.apply (阻塞)
res.get(timeout=2) 獲取執行return的結果
subprocess(經常用來執行Linux命令,非常方便)
cmds = [‘ls’, ‘-l’]
subprocess.call(cmds, stdout=fd, stderr=fd)
返回執行後狀態碼
subprocess.check_call(cmds, stdout=fd, stderr=fd)
執行成功返回0,失敗拋出異常
subprocess.call_output(cmds, stderr=fd)
執行成功返回標準輸出,失敗拋出異常
都是阻塞執行命令,標準與錯誤輸出到文件句柄或者PIPE
多進程注意點:
1、不能使用Lock嵌套,會導致死鎖,應該使用RLock嵌套
2、多線程/進程,隨時可能發生切換,操作相同變量要加鎖
3、多進程普通類型共享,可以使用共享內存Value,Array,效率高