問題:子進程全局變量沒有按照預想的更新,致使數據沒有寫入磁盤。進程池必須在if __name__ == '__main__'
下面使用
復現:見實驗代碼
環境:centos7, python3.7
緣由: 子進程的__name__
屬性值不是'__main__'
解決辦法:須要用到的資源要在if __name__ == '__main__':
語句以前肯定好。在這語句以後的值不會傳遞到子進程裏。html
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,)
輸出:python
進程0: date的值: 初始日期 進程1: date的值: 初始日期
python的多進程在類Unix OS和Windows OS下的實現是不同的,前者可使用fork,然後者是python解釋器新開一個進程,而後使用序列化須要用到的資源傳到那個進程中,此時在子進程的那些模塊下打印locals()
會顯示裏面的__name__
字段並非__main__
(個人顯示的是_ua_main__
)。
另外若是運行python腳本的話,多進程必須在if __name__ == '__main__':
語句下才會執行,否則會報錯。
另外,若是想在進程間通行,請使用官方的隊列方法或者管道,由於全局變量在父進程和子進程之間的值是獨立的,改變其中一個不會同步到另外的進程。centos
官網連接以下,裏面對多進程的一些注意點和坑都說明的很清楚了:
https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessingapp