簡體   English   中英

當父級編退出時,python subprocess.popen殺死subprog嗎?

[英]python subprocess.popen kill subprog when parent prog exits?

在python 2.7中,如果程序master使用subprocess.Popen啟動subprocess然后退出,則subprocess將繼續運行。 我認為這至少與* nix的流程處理是一致的。

這似乎暗示着,如果我的某些subprocess程序永遠運行並且殺死了master這些子流程將繼續運行。 那是對的嗎? (我之所以問,是因為殺死一個進程的行為不同於僅僅讓它自己退出的行為)。

在有關命令外殼(不是Python)的StackOverflow條目中,提到了能夠創建一個子進程的過程,如果該子進程的創建者進程死亡,該子進程實際上將終止。 它們似乎被稱為“守護進程”。

有沒有類似的方法可以在Python中自動實現呢? 也就是說,有沒有一種方法可以使用subprocess.Popen或其他方法來啟動一個子進程,如果父進程死亡,該進程將自動死亡?

子進程非常不同,因此無法選擇線程。

術語“守護程序”在這里可能比幫助更令人困惑。 這意味着您無需等待/加入。 對於一個線程,這實際上意味着一個線程將在退出時被隱式殺死。但是對於一個子進程,它意味着一個將在后台運行並繼續執行的進程,即使其父進程,會話,tty等等。都死了 subprocess文檔甚至沒有提到該術語,可能是為了避免這種混淆。

無論如何,如果您希望子代在所有平台上都自動與父代脫離,則需要明確地做到這一點。

對於一個可以訪問所有Popen對象的頂層腳本的好的設計而言,最簡單的方法是在頂層:

if __name__ == '__main__':
    try:
        # do a bunch of stuff, including launching lots of children
    finally:
        for p in childprocs:
            p.kill()
        for p in childprocs:
            p.wait()

您當然可以通過等待超時然后終止而變得更狂熱,或者只是終止它們而不必先嘗試殺死它們,發送其他信號,或者……隨便什么。 但這是基本思想。

在某些情況下,最好將ExitStack語句與with語句一起使用,在將子項創建時將其添加到ExitStack中。

另一方面,在某些復雜的腳本中,實際上沒有從頂層訪問子級的好方法,並且您必須使用諸如atexit處理程序之類的簡單工具。


但是,還有另一種通常有效的簡單設計。 如果您沒有運行過多的子代,則可以生成一個線程來wait每個子代,甚至只是run它們而不是創建Popen 如果您正在運行多個子代,則單個線程可以使它們循環並等待超時,盡管這樣做可能更容易使事情變得正確(如果不這樣做,則會浪費資源)。 然后,只需管理您的線程,它們就會自動管理您的孩子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM