python多進程,全局變量未更新問題,已解決

python多進程,全局變量未更新

問題:子進程全局變量沒有按照預想的更新,致使數據沒有寫入磁盤。進程池必須在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

相關文章
相關標籤/搜索