我有这样的事情:
@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运行的迭代器。
答案 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
,但相同的一般原则仍然适用。