2017-08-31 3 views
0

私は竜巻非同期httpクライアントを使用しますが、動作しません。ループ中にこの非同期コードが中断しないのはなぜですか?

from tornado.concurrent import Future 
import time 
def async_fetch_future(url): 
    http_client = AsyncHTTPClient() 
    my_future = Future() 
    fetch_future = http_client.fetch(url) 
    fetch_future.add_done_callback(
     lambda f: my_future.set_result(f.result())) 
    return my_future 

future = async_fetch_future(url) 
while not future.done(): 
    print '.....' 
print future.result() 

答えて

1

イベントループを実行して、非同期の処理を実行する必要があります。あなたはprint IOLoop.current.run_sync(async_fetch_future(url)で、このwhileループを交換する(だけでなく、手動でこのようFutureオブジェクトを処理することは一般的に不要であることに注意することができます。async_fetch_futureが直接AsyncHTTPClient.fetchからFutureを返すことができ、それが何かを行う必要がある場合、@tornado.gen.coroutineasync_fetch_futureを飾るために、より慣用だろうそして、yieldを使用

をあなただけのwhileループでドットを印刷するよりも、他の何かをしたい場合、あなたはおそらく定期的にyield tornado.gen.momentを行いコルーチンを使用する必要があります。

@gen.coroutine 
def main(): 
    future = async_fetch_future(url) 
    while not future.done(): 
     print('...') 
     yield gen.moment 
    print(yield future) 
IOLoop.current.run_sync(main) 
関連する問題