2012-11-16 32 views
0

雖然在使用multiprocessing模塊Python中的項目工作,我觀察到了一些奇怪的行爲。的Python:子進程退出留下它的線程運行

讓我們假設我的主程序P1使用multiprocessing模塊創建過程P2。該過程P2創建的線程本身叫p2_t1。有一個在P2創建這個線程之後沒有代碼塊,所以退出(我不是調用exit,所以它只是從主返回)離開p2_t1晃來晃去。我可以在P1創建子進程的P2

p = Process(target=RunService,args=(/*some args*/),name="p2") 

示例代碼通過strace

示例代碼證實了這一點:

def RunService(): 
    try: 
     /*do something here*/ 
    except Exception,e: 
     /*create a new thread*/ 

    /*nothing here so basically this process exits leaving the thread dangling*/ 

然而,這並不如果一個線程發生(呼叫是p1_t1)的內P1創建。 P1亙古不退出,直到創建的線程p1_t1運行。

實施例的代碼在這種情況下爲P1

try: 
    /*do something here*/ 
except Exception,e: 
    /*create a new thread*/ 

    /*nothing here so basically process should end*/ 

在這種情況下的處理不列入出口和繼續工作,直到線程正在運行。任何解釋?

+0

使用反引號('\'')爲行內代碼,而不是大膽。 – katrielalex

+0

這不是代碼,所以我想大膽的:) ..將遵守下一次 – auny

回答

0

沒有任何代碼來說話的,它是很難說發生了什麼,但我會嘗試讓你的線程守護線程,然後就可以等待與P2。當胎面完成後,然後p2應該正常關閉,殺死線。事情是這樣的:

t1 = threading.Thread(target=somefunc, args=((2,))) 
t1.setDaemon(True) 
t1.start() 
t1.join() 

好運,麥克

+0

示例代碼準確地描述它。過程函數完全如此。我有興趣瞭解其中的差異。即使其線程正在運行,子進程'p2'也能夠退出。但'p1'不會退出,直到線程結束。 'p1'是我用'python myservice'啓動我的程序時創建的進程。這種行爲是因爲python解釋器調用了第一級過程嗎? – auny