Python -- 多進程

進程通信

方式一、共享內存(進程安全,效率高)

共享變量: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,效率高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章