我想要实现的目标:我希望异步生成多个进程而不等待结果,但我还要确保每个生成的进程都会在给定的超时内结束.
我在这里发现了类似的问题:Using module ‘subprocess’ with timeout和Asynchronous background processes in Python?但它们并没有解决我的问题.
我的代码看起来像这样.我有Using module ‘subprocess’ with timeout中建议的Command类:
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运行之前结束.
最佳答案
如前所述,对process.communicate()的调用使您的代码等待子进程的完成.但是,如果你只是删除了communication()调用,线程将在产生进程后立即退出,导致你的thread.join()调用过早退出,你将过早地杀掉子进程.要在没有轮询或忙等待的情况下执行您想要的操作,您可以设置一个计时器,如果进程尚未完成,将在超时后终止进程(和运行程序线程):
class Command(object):
def __init__(self,timeout):
def target():
print('Thread started')
# May want/need to skip the shlex.split() when using shell=True
# See Popen() constructor docs on 'shell' argument for more detail.
args = shlex.split(self.cmd)
self.process = subprocess.Popen(args,shell=True)
self.timer.start()
self.process.wait()
self.timer.cancel()
def timer_callback():
print('Terminating process (timed out)')
self.process.terminate()
thread = threading.Thread(target=target)
self.timer = threading.Timer(timeout,timer_callback)
thread.start()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。