2015-06-24 101 views
1

我正在寫在python3.4管理2-3其他外部進程的守護進程拆卸處理。我試圖通過僅僅劃分他們所做的工作來避免GIL。這些其他過程本質上是暫時的。所以,我需要什麼:菌種和蟒蛇

從Python解釋器中啓動一個進程,並立即啓動它的一個卸下。我希望它們完全隔離而不共享stdout,stderr,stdin或其他資源。我不想等待進程退出,返回代碼,stdout,stderr或通過stdin提供數據。

根據該文檔,它現在推薦給子進程。這是我現在使用:

subprocess.Popen(["python3.4", daemonfile], env=env) 

它的工作原理,但:

  • 啓動進程時,輸出和錯誤都印製在主守護進程啓動時的同一控制檯上。我希望他們完全分離。
  • 與「殼=真」,Python解釋進入「翻譯模式」代替。
  • subprocess.Popen是建議贊成os.spawn的***調用

什麼是開始一個完全獨立的進程(從技術上說,甚至沒有一個孩子?)的最佳方式,並其完全脫落,從父母,使他們不共享資源?

+0

沒有一點擔心GIL在這種情況下:CPython的每個進程都有自己的GIL。 – jfs

+0

你可能不需要一個真正的守護進程,但這裏是[一個示例實現和描述(點擊pep鏈接)](https://pypi.python.org/pypi/python-daemon/) – jfs

+0

這是錯誤的使用'shell = True'和一個列表參數。比較:'sh -c'python a.py''與'sh -c'python'a.py'(你不需要後者)。 – jfs

回答

0

首先,除了第一個進程外,沒有任何進程與任何進程完全「分離」,即使是操作系統內核也是如此。你可以發現,對於所有其他進程總是有一個根進程。

那麼,有沒有辦法來啓動一個完整的獨立的進程甚至沒有一個孩子。

你可以做的是使用multiprocessing模塊來避免GIL限制,它是一個獨立的進程通過管道與主進程通信,所以它們不共享相同的內存空間。

至於其他問題:

  1. 您可以將輸出和錯誤更改,無論你喜歡,只要它是一個有效的描述符。

  2. 可以關閉殼=真...只是爲了確保你知道什麼是殼=真

  3. 子只是一個平均值來執行的東西,並得到它的輸出或錯誤。做什麼建議。如果您不關心輸出或退出代碼,只需忽略它,然後使用subprocess.PIPE替換stdout/stderr,那麼它將不會在控制檯上打印任何內容。

我不確定爲什麼使用獨立進程非常重要,除非GIL限制了您的性能。使用線程而不是進程也可以提高性能,因爲切換進程上下文比線程上下文昂貴得多。如果只是一些IO操作或簡單的任務,使用線程更方便。

+0

有意義的是,完全分離是不可能的。我只需要測試當主「節點」死亡時會發生什麼,但我認爲它可能會對shell有所幫助。主要問題是分離的子項的輸出仍然出現在啓動它的守護進程的控制檯輸出中,但是可以使用stdout/stderr設置來解決此問題,並將其記錄到文件中。 – radialmind

+0

如果使用'multiprocessing'模塊,如果父進程已停止,子進程將不會終止。這是不好的,因爲沒有人知道是誰創建了子進程以及它爲什麼仍在運行。它就像一個鬼 – Wingzero