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