異步子我有產卵與超時異步子流程在Python 3與超時
我想達到什麼問題:我想產卵多個進程異步無需等待結果,但我想也可以放心,每個產生的進程將在給定的超時內結束。
我在這裏發現了類似的問題:Using module 'subprocess' with timeout和Asynchronous background processes in Python?但他們沒有解決我的問題。
我的代碼看起來像這樣。我有一個命令類的建議在Using module 'subprocess' with timeout:
class Command(object):
def __init__(self, cmd):
self.cmd = cmd
self.process = None
def run(self, timeout):
def target():
print('Thread started')
args = shlex.split(self.cmd)
self.process = subprocess.Popen(args, shell=True)
self.process.communicate()
print('Thread finished')
thread = threading.Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
print('Terminating process')
self.process.terminate()
thread.join()
,然後當我想產卵子流程:當我運行此輸出似乎等待每個命令產卵和結束
for system in systems:
for service in to_spawn_system_info:
command_str = "cd {0} && python proc_ip.py {1} {2} 0 2>>{3}".format(home_dir,
service, system, service_log_dir)
command = Command(command_str)
command.run(timeout=60)
。我得到
Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread finished
所以我的問題是我做錯了什麼?現在我開始懷疑是否有可能產生一個進程並通過超時限制它的執行。
爲什麼我需要這個? spawner腳本將在cron中運行。它將每隔10分鐘執行一次,它必須產生大約20個子進程。我想保證每個子進程都會在腳本從cron重新運行之前結束。
當我嘗試這個解決方案時,它不會在超時後終止我的線程。我將超時設置爲1秒,並在目標函數中添加time.sleep(1)。沒有線程被終止。 – sebast26 2013-05-14 13:20:11
Hrmm。當target()退出時,線程應該終止。請記住,如上所述,如果過程正常退出而不超時,則不會得到打印輸出。我會仔細觀察一下,我可能忽略了一些東西。 – mshildt 2013-05-14 13:29:15
因此,如果線程在子進程完成之前終止,子進程將終止?這與unutbu說的相反。他說,「那麼,即使你的線程完成後,你產生的每個子進程都將繼續存在」。我還有一個印象,就是子進程會繼續下去。 – b10hazard 2013-05-14 13:36:29