python多進程,全局變數未更新問題
- 2020 年 1 月 2 日
- 筆記
python多進程,全局變數未更新
問題:子進程全局變數沒有按照預想的更新,導致數據沒有寫入磁碟。進程池必須在if __name__ == '__main__'
下面使用 復現:見實驗程式碼 環境:centos7, python3.7 原因: 子進程的__name__
屬性值不是'__main__'
解決辦法:需要用到的資源要在if __name__ == '__main__':
語句之前確定好。在這語句之後的值不會傳遞到子進程里。
程式碼
from multiprocessing import Pool date = '初始日期' def foo(): print(f'date的值: {date}') if __name__ == '__main__': date = '覆蓋初始日期' # 多進程,全部不能覆蓋 with Pool(2) as mypool: for i in range(2): print(f'進程{i}:') mypool.apply(foo,)
輸出:
進程0: date的值: 初始日期 進程1: date的值: 初始日期
總結
python的多進程在類Unix OS和Windows OS下的實現是不一樣的,前者可以使用fork,而後者是python解釋器新開一個進程,然後使用序列化需要用到的資源傳到那個進程中,此時在子進程的那些模組下列印locals()
會顯示裡面的__name__
欄位並不是__main__
(我的顯示的是_ua_main__
)。 另外如果運行python腳本的話,多進程必須在if __name__ == '__main__':
語句下才會執行,不然會報錯。 另外,如果想在進程間通行,請使用官方的隊列方法或者管道,因為全局變數在父進程和子進程之間的值是獨立的,改變其中一個不會同步到另外的進程。
官網鏈接如下,裡面對多進程的一些注意點和坑都說明的很清楚了: https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessing