2015-04-15 6 views
10

Ho iniziato a imparare il framework Tornado qualche tempo fa. Ho affrontato la mancanza di documentazione per utenti inesperti e ho controllato anche i documenti del modulo asyncio. Quindi il problema è che ho qualche semplice codice in asyncio:Quadro di Tornado. TypeError: l'oggetto 'Future' non è richiamabile

import asyncio 

    @asyncio.coroutine 
    def compute(x, y): 
     print("Compute %s + %s ..." % (x, y)) 
     yield from asyncio.sleep(1.0) 
     return x + y 


    @asyncio.coroutine 
    def print_sum(x, y): 
     result = yield from compute(x, y) 
     print("%s + %s = %s" % (x, y, result)) 


loop = asyncio.get_event_loop() 
loop.run_until_complete(print_sum(1, 2)) 
loop.close() 

E poi ho cercato di fare la stessa struttura con Tornado:

from tornado.ioloop import IOLoop 
from tornado import gen 

@gen.coroutine 
def compute(x, y): 
    print("Compute %s + %s ..." % (x, y)) 
    yield gen.sleep(1.0) 
    return (x+y) 

@gen.coroutine 
def print_sum(x, y): 
    result = yield compute(x, y) 
    print("%s + %s = %s" % (x, y, result)) 

IOLoop.instance().run_sync(print_sum(1,2)) 

Ma purtroppo codice Tornado sollevare un tale eccezione:

Compute 1 + 2 ... 
Traceback (most recent call last): 
    File "tornado_coroutine.py", line 19, in <module> 
    IOLoop.instance().run_sync(print_sum(1, 2)) 
    File "C:\Python34\lib\site-packages\tornado\ioloop.py", line 421, in run_sync 
    return future_cell[0].result() 
    File "C:\Python34\lib\site-packages\tornado\concurrent.py", line 209, in resul 
t 
    raise_exc_info(self._exc_info) 
    File "<string>", line 3, in raise_exc_info 
    File "C:\Python34\lib\site-packages\tornado\ioloop.py", line 402, in run 
    result = func() 
TypeError: 'Future' object is not callable 

Forse IOLoop prova a fare un nuovo "giro" dopo che tutti i co-routine sono tornati i loro valori?

risposta

17

run_sync accetta una funzione (o un altro "callable") come argomento. Stai chiamando la funzione sul posto e poi dai il risultato come argomento. È possibile creare una funzione anonima semplicemente utilizzando lambda:

IOLoop.instance().run_sync(lambda: print_sum(1,2)) 
+0

Grazie Klaus! – Anton