2017-08-31 6 views
0

J'utilise le client http asynchrone tornado, mais cela ne fonctionne pas.pourquoi ce code asynchrone ne cassera pas pendant la boucle?

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() 

Répondre

1

Vous devez exécuter la boucle d'événements pour permettre l'exécution de tâches asynchrones. Vous pouvez remplacer cette boucle while avec print IOLoop.current.run_sync(async_fetch_future(url) (mais notez que ceci est la manipulation manuellement Future objets comme généralement inutiles, async_fetch_future peut retourner le Future de AsyncHTTPClient.fetch directement, et si elle a besoin de faire autre chose, il serait plus idiomatiques pour décorer async_fetch_future avec @tornado.gen.coroutine . et utiliser yield

Si vous voulez faire autre chose que des points d'impression dans la boucle while, vous devriez probablement utiliser un coroutine qui fait périodiquement 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)