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