進程通訊
方式1、共享內存(進程安全,效率高)
共享變量:multiprocessing.Value
共享數組:multiprocessing.Array
方式2、Manager對象:list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value, Array
Manager對象,相對於共享內存,更加靈活,支持Python對象,能夠經過網絡進行共享,可是效率低
進程同步
Manager對象:Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event
一、簡單同步機制鎖 Lock、RLock(A/B 進程同時修改一個對象,RLock支持嵌套)
二、可控制進程數量 Semaphore, BoundedSemaphore (例如鏈接池限制)
三、複雜同步條件變量 Condition (A/B進程能夠多條件判斷,交替執行)
四、事件控制 Event(A、C進程等待B進程執行某種操做以後才能執行)
進程池
multiprocessing.Pool
res = pool.apply_async (非阻塞)
res = pool.apply (阻塞)
res.get(timeout=2) 獲取執行return的結果
subprocess
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
多進程注意點:
一、不能使用Lock嵌套,會致使死鎖,應該使用RLock嵌套
二、多線程/進程,隨時可能發生切換,操做相同變量要加鎖
三、多進程普通類型共享,能夠使用共享內存Value,Array,效率高