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進行序列化
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並不會。

