我想运行一个龙卷风IOLoop的run_sync方法来启动异步方法。
以下是这个想法:
@gen.coroutine
def async(string):
print string
@gen.coroutine
def sync():
string_list = yield async_call()
for string in string_list:
async(string=string)
loop = IOLoop.current()
loop.run_sync(lambda: sync)
因此,同步的所有内容都需要同步发生,但调用异步的顺序无关紧要。这可能与龙卷风有关吗?
答案 0 :(得分:0)
正如我所看到的,你误解了异步计算的含义。简而言之,如果你有两个在IOLoop中异步执行的函数,每个函数的代码将同时执行,但函数的工作流程仍然是同步的。
当你运行没有async
关键字的yield
方法时,你应该确保它在调用函数之前完成,特别是当你使用run_sync
在函数停止后停止IOLoop时。当async
仍在运行但IOLoop已停止时,这可能会导致未定义的行为。
我编辑了你的代码,以显示sync
的功能工作流程是同步执行的:
@gen.coroutine
def async(string):
yield gen.sleep(2)
print string
@gen.coroutine
def async_call():
return ["one", "two", "three"]
@coroutine
def sync():
string_list = yield async_call()
for string in string_list:
yield async(string)
loop = IOLoop.current()
loop.run_sync(sync)
输出:
$python test_async.py
one
two
three