如何在创建异步子例程时使用Python tornado的run_sync?

时间:2016-04-29 05:44:52

标签: python asynchronous tornado

我想运行一个龙卷风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)

因此,同步的所有内容都需要同步发生,但调用异步的顺序无关紧要。这可能与龙卷风有关吗?

1 个答案:

答案 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