使用子进程时如何限制程序的执行时间?
我想使用子进程来运行程序,并且需要限制执行时间。例如,如果它运行超过2秒我想杀死它。
对于普通程序,kill() 效果很好。但是,如果我尝试运行 /usr/bin/time some
,kill() 无法真正杀死该程序。
我下面的代码似乎不能很好地工作。该程序仍在运行。
import subprocess
import time
exec_proc = subprocess.Popen("/usr/bin/time -f \"%e\\n%M\" ./son > /dev/null", stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True)
max_time = 1
cur_time = 0.0
return_code = 0
while cur_time <= max_time:
if exec_proc.poll() != None:
return_code = exec_proc.poll()
break
time.sleep(0.1)
cur_time += 0.1
if cur_time > max_time:
exec_proc.kill()
I want to use subprocess to run a program and I need to limit the execution time. For example, I want to kill it if it runs for more than 2 seconds.
For common programs, kill() works well. But if I try to run /usr/bin/time something
, kill() can’t really kill the program.
My code below seems doesn’t work well. The program is still running.
import subprocess
import time
exec_proc = subprocess.Popen("/usr/bin/time -f \"%e\\n%M\" ./son > /dev/null", stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True)
max_time = 1
cur_time = 0.0
return_code = 0
while cur_time <= max_time:
if exec_proc.poll() != None:
return_code = exec_proc.poll()
break
time.sleep(0.1)
cur_time += 0.1
if cur_time > max_time:
exec_proc.kill()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您使用的是 Python 2.6 或更高版本,则可以使用 multiprocessing 模块。
实际上,多处理是执行此任务的错误模块,因为它只是控制线程运行时间的一种方法。您无法控制线程可能运行的任何子线程。正如奇点所暗示的那样,使用 signal.alarm 是正常的方法。
If you're using Python 2.6 or later, you can use the multiprocessing module.
Actually, multiprocessing is the wrong module for this task since it is just a way to control how long a thread runs. You have no control over any children the thread may run. As singularity suggests, using signal.alarm is the normal approach.
在命令行中这样做:
这将运行命令
并在
秒后终止。一个虚拟示例:
或者您可以使用 signal.alarm() if你想要用 python 但它是一样的。
do it like so in your command line:
this will run the command
<your_command>
and terminate it in<timeout>
second.a dummy example :
or you can use the signal.alarm() if you want it with python but it's the same.
我使用 os.kill() 但不确定它是否适用于所有操作系统。
伪代码如下,请参阅 Doug Hellman 的页面。
I use os.kill() but am not sure if it works on all OSes.
Pseudo code follows, and see Doug Hellman's page.