簡體   English   中英

從python多處理進程中刪除守護程序

[英]Removing daemon from python multiprocessing process

使用python 3.6,我有一個類似這樣的問題:(1)在尷尬的並行作業上有一個joblib.Parallel循環(2)作業本身是相當耗時的c ++本機對象,有時會出現段錯誤,並且我無法修改其代碼。

為了防止出現段錯誤,我嘗試將作業本身包裝在多處理流程中。 不幸的是,python本身引發了帶有daemonic processes are not allowed to have children的斷言錯誤,該daemonic processes are not allowed to have children使用。

因此,我采用了此處發布的解決方案,並嘗試從Process繼承: https : //stackoverflow.com/a/8963618/614684

那也不起作用,因此我想出了以下可行的解決方案:

class NoDaemonProcess(multiprocessing.Process):
  def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
               *, daemon=None):
    super(NoDaemonProcess, self).__init__(group, target, name, args, kwargs, daemon=daemon)
    if 'daemon' in multiprocessing.process._current_process._config:
      del multiprocessing.process._current_process._config['daemon']
    self._config = multiprocessing.process._current_process._config.copy()
  # make 'daemon' attribute always return False                                                                                                                                              
  def _get_daemon(self):
    return False
  def _set_daemon(self, value):
    pass
  daemon = property(_get_daemon, _set_daemon)

基本上,我修改了多處理程序包的全局狀態,以刪除當前進程是守護程序的事實。

有一個更好的方法嗎? 我將不勝感激,這將使它變得更加強大和可靠。

保持簡單,愚蠢:)

您的錯誤消息在https://github.com/python/cpython/blob/master/Lib/multiprocessing/process.py#L110

您可以使用常規subprocess作為工作負載的一部分。 它將不受任何multiprocessing邏輯的約束。 為避免專門為此創建單獨的Python程序,只需執行

subprocess.Popen([sys.executable,__file__,"<arg>"])

並使<arg>if __name__ == '__main__'塊中觸發必要的邏輯。

要從子過程中獲取結果,請以任何機器可讀格式將其打印到stdout,或使用任何IPC機制。

暫無
暫無

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

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