Python多進程相關的坑


Python的multiprocessing模塊實現了多進程功能,但官方文檔上只有一些比較簡單的用法,主要是使用函數作為process的target,而如何在class中使用多進程並沒有多講解。google出兩篇比較詳細的文章,建議從它們入門:

https://pymotw.com/2/multiprocessing/basics.html

https://pymotw.com/2/multiprocessing/communication.html

 

下面記錄一下自己這周在python多進程上碰到的坑:

創建進程時,參數必須能夠被pickle,所以有些自定義的類對象實例是不能被作為參數的

和threading不同,multiprocessing Process參數必須能夠被pickle進行序列化

image

Python 2.7,Can’t pickle <type ‘instancemethod’>

python 2.7 的 python 3.5版本中,multiprocessing的行為是不同的,有些代碼可以在3.5中運行,在2.7中卻運行出錯

例如上,在3.5中可以運行,這是因為在3.5版本中,pick可以序列化更多的類型。

盡量避免類實例中包含multiprocess.Manager實例,否則會有

TypeError: Pickling an AuthenticationString object is disallowed for security reasons

或者:

_pickle.PicklingError: Can't pickle <class 'weakref'>: attribute lookup weakref on builtins failed

進程間共享的對象,使用Manager進行管理

Manager會生成一個進程,所以不同進程間訪問統一變量,是通過IPC進行的,會有性能上的開銷。

 

關於主進程所在的文件代碼

使用multiprocessing時,主模塊會被import到各進程中,所以創建子進程的部分,必須使用

if __name__ == '__main__:

進行保護,否則會有runtime error,或者遞歸創建子進程

 

Update 1 (2018-11-08): 

在Windows環境中,jupyter-notebook中,即使使用if __name__ == '__main__進行保護,也會出現runtime error,這個時候可以將jupyter中的代碼下載成py腳本,直接運行腳本。

作為對比,Linux下運行的jupyter-notebook並不會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM