[英]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.