摘要:多進程,全局變量未更新問題子進程全局變量沒有按照預(yù)想的更新,導(dǎo)致數(shù)據(jù)沒有寫入磁盤。另外,如果想在進程間通行,請使用官方的隊列方法或者管道,因為全局變量在父進程和子進程之間的值是獨立的,改變其中一個不會同步到另外的進程。
python多進程,全局變量未更新
問題:子進程全局變量沒有按照預(yù)想的更新,導(dǎo)致數(shù)據(jù)沒有寫入磁盤。進程池必須在if __name__ == "__main__"下面使用
復(fù)現(xiàn):見實驗代碼
環(huán)境: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的值: 初始日期總結(jié)
python的多進程在類Unix OS和Windows OS下的實現(xiàn)是不一樣的,前者可以使用fork,而后者是python解釋器新開一個進程,然后使用序列化需要用到的資源傳到那個進程中,此時在子進程的那些模塊下打印locals()會顯示里面的__name__字段并不是__main__(我的顯示的是_ua_main__)。
另外如果運行python腳本的話,多進程必須在if __name__ == "__main__":語句下才會執(zhí)行,不然會報錯。
另外,如果想在進程間通行,請使用官方的隊列方法或者管道,因為全局變量在父進程和子進程之間的值是獨立的,改變其中一個不會同步到另外的進程。
官網(wǎng)鏈接如下,里面對多進程的一些注意點和坑都說明的很清楚了:
https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessing
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43382.html
摘要:主進程會等待所有的子進程先結(jié)束,然后再結(jié)束主進程。關(guān)閉進程池,關(guān)閉后實例不再接收新的請求等待實例中的所有子進程執(zhí)行完畢,主進程才會退出,必須放在語句之后。主進程一般都用來等待,任務(wù)在子進程中執(zhí)行。 多任務(wù):同一個時間段中,執(zhí)行多個函數(shù)/運行多個程序. 操作系統(tǒng)可以同時運行多個任務(wù):操作系統(tǒng)輪流讓各個任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,...
摘要:說一下進程線程以及多任務(wù)多進程多線程和協(xié)程進程概念一個程序?qū)?yīng)一個進程,這個進程被叫做主進程,而一個主進程下面還有許多子進程。避免了由于系統(tǒng)在處理多進程或者多線程時,切換任務(wù)時需要的等待時間。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 閱讀本文大約需要 10 分鐘。 14.說一下進程、線程、以及多任務(wù)(多進...
摘要:解決的辦法在處理計算密集型任務(wù)時,使用多進程協(xié)程,發(fā)揮計算機多核的威力,而處理密集型,則可以使用多線程。至此,有關(guān)知識點的面試題就已告一段落,下次更新數(shù)據(jù)庫,方面面試題。 showImg(https://segmentfault.com/img/bVbuYzy?w=3484&h=2480); 閱讀本文大約需要 5 分鐘。 15.說一說 GIL 前面有提到由于 Python 基于 C 語...
摘要:從存儲的字符串表示中檢索原始對象的過程稱為。這稱為命名空間。如果需要八進制或十六進制表示,請使用內(nèi)置函數(shù)或。和有什么區(qū)別返回對象,而返回列表,并使用相同的內(nèi)存,無論范圍大小是多少。它提供了靈活性,并允許開發(fā)人員為他們的項目使用正確的工具。 ...
摘要:很簡單,這個模塊實現(xiàn)了開辟一塊共享內(nèi)存空間,就好比中的方法一樣,有興趣的同學(xué)可以去查閱。查了下資料,返回的對象控制了一個進程,可用于多進程之間的安全通信,其支持的類型有和等。 有關(guān)于 multiprocessing 中共享變量的問題 現(xiàn)在的cpu都很強大,比方我用的至強2620有24核可以同時工作,并行執(zhí)行進程程序。這在計算密集型的程序是很需要的,如沙漠中的綠洲,令人重獲新生。那么,問...
閱讀 3743·2021-11-22 13:52
閱讀 3622·2019-12-27 12:20
閱讀 2395·2019-08-30 15:55
閱讀 2150·2019-08-30 15:44
閱讀 2267·2019-08-30 13:16
閱讀 582·2019-08-28 18:19
閱讀 1892·2019-08-26 11:58
閱讀 3445·2019-08-26 11:47