2017-08-31 63 views
0

我使用龍捲風異步http客戶端,但它不起作用。爲什麼這個異步代碼在while循環中不會中斷?

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.fetchFuture,如果需要做其它的事情會更地道的裝飾async_fetch_future@tornado.gen.coroutine以及使用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) 
相關問題