摘要:今天在測試多進程時發(fā)現(xiàn)了一個問題測試代碼上述代碼不復雜肉眼就能猜出八九分父進程來執(zhí)行了首尾的兩個而子進程則只執(zhí)行下面就這針對這一個猜測來驗證在下很符合我們的預(yù)期因為兩次得到了一樣的結(jié)果而子進程的那句輸出也從側(cè)面驗證了另外兩句是父進程執(zhí)行的接
今天在測試多進程時, 發(fā)現(xiàn)了一個問題
測試代碼:
#coding: utf8 from multiprocessing import Process import os print("Global_print", os.getpid()) def run_proc(name): print("Run child process %s (%s)…" % (name, os.getpid())) if __name__=="__main__": p = Process(target=run_proc, args=("test",)) print(os.getpid()) p.start()
上述代碼不復雜, 肉眼就能猜出八九分: 父進程來執(zhí)行了首尾的兩個print, 而子進程則只執(zhí)行run_proc ,
下面就這針對這一個猜測來驗證:
在LInux下,
"Global_print", 14382 14382 Run child process test (14383)…
很符合我們的預(yù)期, 因為兩次os.getpid()得到了一樣的結(jié)果, 而子進程的那句輸出也從側(cè)面驗證了另外兩句print是父進程執(zhí)行的.
接下來看下Windows:
What ???...黑人問號..這是什么鬼..分分鐘被打臉...
在測試了debian/centos等等 unix/linux不同發(fā)行版和不同Python版本, 表現(xiàn)均為一致, 也就是上面Linux的輸出.
然而..在Windows下也也是很頑固的和上面的輸出不一致..
總所周知, Windows和 Linux在實現(xiàn)多進程上面是有點區(qū)別的..
于是, 感覺應(yīng)該是Windows自身的問題, 在咨詢了大佬之后, 得知官網(wǎng)早已有對這塊進行說明了:
傳送門: https://docs.python.org/2/lib...
摘抄資料如下:
簡單的意思應(yīng)該是下面這樣:
因為Windows缺乏linix那種fork, 所以它會有一些額外的限制:
不管是綁定還是未綁定的方法, 都不要直接作為參數(shù)傳給Process初始化的target, 相反應(yīng)該要用普通的函數(shù)代替
子進程在訪問全局變量時, 可能會與父進程的值不同. ( 模塊級別的常量沒這問題 )
開啟新Python解析器或者創(chuàng)建新process時, 確定主模塊能夠安全的導入.
而剛才的那個問題, 就是因為沒有注意到第三點, 所以導致了意想不到的的副作用, 應(yīng)該用下面的寫法取代上面的不安全寫法:
from multiprocessing import Process, freeze_support def foo(): print "hello" if __name__ == "__main__": freeze_support() p = Process(target=foo) p.start()
果然..Windows無處不在都在挖坑....
歡迎各位大神指點交流, QQ討論群: 258498217
轉(zhuǎn)載請注明來源: https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44606.html
摘要:近年來,人工智能的興起使得更加火爆了。獲取當前進程父進程的。但是唯一遺憾的是,函數(shù)只能在系統(tǒng)中使用,不能在系統(tǒng)中使用。因此在下,需要將其包含在中。則是立即返回一個可迭代對象。則是返回可迭代函數(shù)。 Python一直是一門對初學者非常友好的語言,在數(shù)據(jù)分析、Web 開發(fā)、網(wǎng)絡(luò)安全、網(wǎng)絡(luò)爬蟲等方面應(yīng)用廣泛。近年來,人工智能的興起使得 Python 更加火爆了。 我們在處理大量數(shù)據(jù)或者需要快速...
摘要:多進程執(zhí)行任務(wù)結(jié)束,創(chuàng)建進程和銷毀進程是時間的,如果長度不夠,會造成多線程快過多進程多線程執(zhí)行任務(wù)結(jié)束,進程間通信生產(chǎn)者消費者模型與隊列演示了生產(chǎn)者和消費者的場景。 進程 Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發(fā)揮多核的優(yōu)勢。而使用多進程(Multiprocess),則可以發(fā)揮多核的優(yōu)勢真正地提...
摘要:普通的函數(shù)調(diào)用,調(diào)用一次,返回一次,但是調(diào)用一次,返回兩次,因為操作系統(tǒng)自動把當前進程稱為父進程復制了一份稱為子進程,然后,分別在父進程和子進程內(nèi)返回。子進程永遠返回,而父進程返回子進程的。 一、Before Python學習過程中,經(jīng)常發(fā)現(xiàn)教程上講的函數(shù)在本機上會報錯: AttributeError: module object has no attribute *** 作為一個初學...
摘要:分布式進程在和中,應(yīng)當優(yōu)選,因為更穩(wěn)定,而且,可以分布到多臺機器上,而最多只能分布到同一臺機器的多個上。由于模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細節(jié),就可以很容易地編寫分布式多進程程序。 分布式進程 在Thread和Process中,應(yīng)當優(yōu)選Process,因為Process更穩(wěn)定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。 Pytho...
閱讀 2070·2021-11-23 09:51
閱讀 3364·2021-09-28 09:36
閱讀 1138·2021-09-08 09:35
閱讀 1784·2021-07-23 10:23
閱讀 3279·2019-08-30 15:54
閱讀 3014·2019-08-29 17:05
閱讀 451·2019-08-29 13:23
閱讀 1307·2019-08-28 17:51