如何从功能而不是屈服中运行龙卷风的未来

时间:2014-11-13 10:30:06

标签: python asynchronous web tornado

我有这样的事情:

@coroutine
def foo(): # it can be a http-handler method
    bar()

def bar() # it must be 'next()' of iterator
    # How to run from here foo_2?

@coroutine
def foo_2(): # Something asynchronous
    ....

实际上,我想创建一个使用REST运行的迭代器。

2 个答案:

答案 0 :(得分:1)

由于foo_2返回Future,您需要手动获取结果:

def bar():
    value = foo_2().result()

答案 1 :(得分:1)

一般情况下,要在Tornado中使用Future,您必须在协程中使用它,或者使用其add_done_callback方法等待它完成,然后才能使用{{1方法来查看结果。

不幸的是,这意味着在result循环迭代等同步环境中使用Futures是不可能的。相反,你的迭代器必须生成调用者必须产生的Futures(因此调用者必须是一个协程):

for

blog post中有更多关于迭代的不同模式的讨论。它现在有点过时,因为它是为Tornado 2.x编写的,使用for future in my_iterator(): result = yield future gen.engine代替gen.Task,但相同的一般原则仍然适用。