我可以酿出这一个新的线程,并指定。加入)时间(方法,但我不能轻易得到的结果出来的
如果超时,这意味着该方法没有完成,所以没有结果。如果你有增量结果,你可以将它们存储在某个地方,然后将它们读出来(不管你喜欢什么)(记住threadsafety)。
使用基于SIGALRM的系统是非常危险的,因为它可以在任何时候提供异步信号,即使在除了最终处理程序期间,您也不期待它。 (其它语言处理这个更好的,可惜。)例如:
try:
# code
finally:
cleanup1()
cleanup2()
cleanup3()
的信号经由SIGALRM向上传递cleanup2期间可能发生(),这将导致cleanup3()将永远不会被执行。 Python根本无法以一种既不合作又不安全的方式终止正在运行的线程。
您应该让代码自行检查超时。
import threading
from datetime import datetime, timedelta
local = threading.local()
class ExecutionTimeout(Exception): pass
def start(max_duration = timedelta(seconds=1)):
local.start_time = datetime.now()
local.max_duration = max_duration
def check():
if datetime.now() - local.start_time > local.max_duration:
raise ExecutionTimeout()
def do_work():
start()
while True:
check()
# do stuff here
return 10
try:
print do_work()
except ExecutionTimeout:
print "Timed out"
(当然,这属于一个模块中,所以代码实际上看起来像 “timeout.start()”; “timeout.check()”。)
如果您正在生成动态编码,然后在每个循环的开始处生成一个timeout.check()调用。
即使是来自可靠来源,你可以只使用'进口source',每当它的变化,用'重装(源)'。这样,您不会污染全局名称空间。你必须使用'source.run()'。 – voyager 2009-09-25 14:53:38