foo(n)如果它运行超过10秒钟我想打电话但是停止它.这样做的好方法是什么?
我可以看到我理论上可以修改foo自己以定期检查它运行了多长时间,但我宁愿不这样做.
我想执行一个进程,以秒为单位将执行时间限制为一些超时并获取进程产生的输出.我想在windows,linux和freebsd上做这个.
我试过以三种不同的方式实现它:
cmd - 没有超时和subprocess.PIPE用于输出捕获.
行为:按预期运行但不支持超时,我需要超时...
cmd_to - 使用timeout和subprocess.PIPE进行输出捕获.
BEHAVIOR:当输出> = 2 ^ 16字节时阻止子进程执行.
cmd_totf - 使用timeout和tempfile.NamedTemporaryfile进行输出捕获.
行为:按预期运行,但在磁盘上使用临时文件.
这些可在下面获得进一步检查.
从下面的输出中可以看出,当使用子处理时,超时代码会阻止子进程的执行.PIPE和子进程的输出是> = 2 ^ 16字节.
子进程文档说明在调用process.wait()和使用subprocessing.PIPE时这是预期的,但是在使用process.poll()时没有给出警告,那么这里出了什么问题?
我在cmd_totf中有一个使用tempfile模块的解决方案,但权衡是它将输出写入磁盘,这是我真正想要避免的.
所以我的问题是:
用于生成一堆输出的脚本('exp_gen.py'):
#!/usr/bin/env python
import sys
output = "b"*int(sys.argv[1])
print output
Run Code Online (Sandbox Code Playgroud)
子处理周围包装器的三种不同实现(cmd,cmd_to,cmd_totf).Popen:
#!/usr/bin/env python
import subprocess, time, tempfile
bufsize = -1
def cmd(cmdline, timeout=60):
"""
Execute cmdline.
Uses subprocessing and subprocess.PIPE.
"""
p = subprocess.Popen(
cmdline,
bufsize = bufsize,
shell = False,
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE
) …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于使用线程,子进程等的帖子.对于我正在尝试做的事情,很多事情似乎过于复杂......
我想要做的就是在X时间过后停止执行一个函数.
def big_loop(bob):
x = bob
start = time.time()
while True:
print time.time()-start
Run Code Online (Sandbox Code Playgroud)
此函数是一个无限循环,永远不会抛出任何错误或异常,句点.我不确定"命令,shell,子进程,线程等......"和这个函数之间的区别,这就是我在操作子进程时遇到问题的原因.
我在这里找到了这个代码,然后尝试了它,但是你可以看到它在10秒后继续打印:
import time
import threading
import subprocess as sub
import time
class RunCmd(threading.Thread):
def __init__(self, cmd, timeout):
threading.Thread.__init__(self)
self.cmd = cmd
self.timeout = timeout
def run(self):
self.p = sub.Popen(self.cmd)
self.p.wait()
def Run(self):
self.start()
self.join(self.timeout)
if self.is_alive():
self.p.terminate()
self.join()
def big_loop(bob):
x = bob
start = time.time()
while True:
print time.time()-start
RunCmd(big_loop('jimijojo'), 10).Run() #supposed to quit after 10 seconds, but doesn't
x = raw_input('DONEEEEEEEEEEEE')
Run Code Online (Sandbox Code Playgroud)
这个功能被杀死的简单方法是什么.正如你在上面的尝试中所看到的那样,它在20秒后不会终止并继续......
***哦,我也读过有关使用信号的内容,但是我在Windows上,所以我不能使用闹钟功能..(python …
我遇到的问题是urllib2.urlopen/ requests.post是很偶然阻塞永远对socket.recv不退还.
我试图找出为什么会发生这种情况并解决这个问题,但同时我想知道是否有办法防止它永远阻塞?
我已经知道了timeout可选参数urllib2.urlopen,socket.setdefaulttimeout但不幸的是,对于我的用例,超时不是解决方案因为我使用POST上传文件我使用的任何超时值都可能会中断正常的文件上传.
我也看到了一些使用信号的解决方案,但这会产生与使用超时相同的问题(也是问题,因为我不是从主线程中执行此操作).
是否有可能在没有数据通过套接字发送/接收一段时间后才能超时?或者也许有一些方法我可以使用select/poll来防止我遇到的死锁/阻塞?
如果有使用select/poll的解决方案,我将如何将其合并到urllib2.urlopen/ requests.post?
我还有一个想法,如果我可以通过写入类型的接口发送文件数据,所以我控制迭代文件并一次发送块我可能有足够的控制来避免停顿.我不知道如何实现它,所以我问了一个问题:使用file.write接口上传文件
更新
似乎我总是误解了timeoutpython 中的含义,它似乎实际上是空闲超时或读/写超时(可能是我第一次不同意Guido).我一直以为这是响应应该返回的最长时间 - 谢谢@tomasz指出这个!
但是,增加超时参数(这两个测试后urllib2和requests)我已经遇到了一些非常奇怪和微妙的情况下,可能MAC具体,超时工作不正常,我正在越来越倾向于认为是一个错误.我将继续调查并确切地找出问题所在.再次感谢tomasz对此的帮助!