1

我的問題涉及到下面的代碼:使用join()方法在python多處理

import multiprocessing 
import math 
import time 


def do_work(): 

    for i in range(1,10,1): 
     math.cos(i) 


workers = [ multiprocessing.Process(target=do_work) for i in xrange(20) ] 

for t in workers: 
    t.daemon = True 
    t.start() 

time.sleep(100) # put here to simply indicate main is busy doing something 

for t in workers: 
    print t.name + " joining" 
    t.join() 

正如你可以看到我的父進程的加盟在子進程之前睡了很長一段時間。我的子進程運行得非常快。

的問題是:

它是確定主進程如上面的例子在子進程加入之前等待很長的時間?當主流程加入時,子進程是否會成爲殭屍存在危險?這段代碼有問題嗎?這種不好的代碼在某種程度上?我該如何改進它?

我嘗試:

我試着學習行爲。對我來說似乎沒問題。但我想我曾經看到一個孩子的過程變成了殭屍,至少有ps輸出顯示。

+1

爲什麼主要過程在等待?你在主流程中做了一些實際的工作,還是真的在睡覺?如果是後者,'join()'方法會爲你睡覺,並且可能對它更有效。 – Kevin

+0

調用't.join()'在主線程中已經完成''t'沒有任何傷害。但是,一般原則是在啓動子線程後加入,以便讓主線程等待子線程完成其任務。 – ozgur

+0

@Kevin我添加了評論。只要考慮到在加入子進程之前main已經做了一些工作。 – abc

回答

0

如果一個進程死亡但沒有確認其退出狀態,進程就會變成殭屍。例如,如果您用KILL信號強制終止腳本,可能會發生這種情況。

如果您的父母程序忙於做其他事情,並且在孩子退出後立即無法撥打join()完全正常。

問題是當你不加入舊的過程而繼續創建過程時。在這種情況下,您的操作系統很快就會耗盡資源。

在您的具體示例中,沒有任何傷害,因爲子進程被設置爲守護進程,並且您在某個時間點加入它們。請記住,join()將阻止,直到給定的過程到期,所以你不需要睡覺等待它。

+0

您的意思是:「請記住,join()會阻止,直到給定的進程**到期**,所以您不需要睡覺就可以等待它。」 – abc

+0

我在主線程(父進程)中的睡眠是簡單地指示進程的一些繁忙工作,沒有別的。 – abc

+0

是的,我的意思是,對於錯誤感到抱歉 – noxdafox