2016-04-29 8 views
1

私は非同期メソッドを起動する竜巻IOLoopのrun_syncでメソッドを実行したいと思います。非同期サブルーチンの作成中にPython tornadoの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

私は、非同期コンピューティングの意味を誤解しています。簡単に言えば、IOLoopで非同期的に実行する2つの関数がある場合、各関数のコードは同時に実行されますが、関数のワークフローは依然として同期しています。

yieldキーワードなしでasyncメソッドを実行すると、特に、機能停止後にIOLoopを停止するrun_syncを使用すると、呼び出し元関数の前に終了するようになります。 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 
+0

ほとんど、実際に機能をスケジュールして実行する非同期を呼び出す、しない限りioloopが停止します。非同期関数では、ioloopを実行する必要があります。 'yield'を使うと、非同期的に終了するまで待機します。 – kwarunek

+0

@kwarunekあなたが言及してくれてありがとう、私は私のマシンでこれをチェックして、それはあなたが言うように実行するようです。しかし、私には明らかではないことが1つあります: 'async'メソッドが' sync'よりも終了するのに時間がかかる場合、IOLoopは終了する前に止められ、 'async'が正しく完了するとは想像もしませんか否か。 – pupizoid

関連する問題