超时后的龙卷风未来结果

时间:2015-06-01 12:52:20

标签: python tornado future coroutine concurrent.futures

这可能听起来有点奇怪,但是Tornado在超时包装之后是否有可能完成未来的执行?

这样的事情:

l.cs

所以在这种情况下,try: result = yield gen.with_timeout(time.time() + 1, future) except gen.TimeoutError as e: print('Timed out!') 在超时之前没有完成,但是我希望它继续执行它具有的任何可调用权。

以不同的方式表达,我希望能够与gen.WaitIterator一起使用它来获得一组期货的结果,如文档中所述:

  

如果您需要尽快获得每个未来的结果,或者如果您需要某些期货的结果,即使其他人产生错误,您也可以使用future

这正是我正在寻找的,我希望每个未来的结果尽快,因为我有一些任务需要比其他任务更长的时间,但有一个例外:那些缓慢的任务应该继续产生结果,这样我就可以访问它们后面。

这甚至可能吗?

1 个答案:

答案 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包装器。)