4

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

所以是这样的:

try:
    result = yield gen.with_timeout(time.time() + 1, future)
except gen.TimeoutError as e:
    print('Timed out!')

所以在这种情况下,future在超时之前没有完成,但我希望它继续执行它所拥有的任何可调用对象。

换句话说,我希望能够使用它gen.WaitIterator来获得一组期货的结果,如文档中所述:

如果你需要尽快得到每个future的结果,或者如果你需要一些future的结果,即使其他future产生错误,你可以使用WaitIterator.

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

这甚至可能吗?

4

1 回答 1

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 中引入的 Queue 类。这些通常可以生成比 WaitIterator 更简洁的代码(并且它们具有内置的超时支持而不是with_timeout包装器)。

于 2015-06-01T17:37:53.430 回答