python多進程,全局變數未更新問題

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