这可能听起来有点奇怪,但是Tornado在超时包装之后是否有可能完成未来的执行?
这样的事情:
l.cs
所以在这种情况下,try:
result = yield gen.with_timeout(time.time() + 1, future)
except gen.TimeoutError as e:
print('Timed out!')
在超时之前没有完成,但是我希望它继续执行它具有的任何可调用权。
以不同的方式表达,我希望能够与gen.WaitIterator
一起使用它来获得一组期货的结果,如文档中所述:
如果您需要尽快获得每个未来的结果,或者如果您需要某些期货的结果,即使其他人产生错误,您也可以使用
future
。
这正是我正在寻找的,我希望每个未来的结果尽快,因为我有一些任务需要比其他任务更长的时间,但有一个例外:那些缓慢的任务应该继续产生结果,这样我就可以访问它们后面。
这甚至可能吗?
答案 0 :(得分:3)
with_timeout
不会取消基础Future
,因此可以重复使用:
future = do_something_async()
while True:
try:
result = yield gen.with_timeout(timedelta(seconds=1), future)
break
except gen.TimeoutError:
print('tick')
将此与WaitIterator
相结合有点棘手,因为在前一个完成之前,您不得再次调用WaitIterator.next
。
还要考虑Tornado 4.2中引入的队列类。这些通常可以产生比WaitIterator更清晰的代码(并且它们具有内置的超时支持而不是with_timeout
包装器。)