2015-04-15 17 views
10

मैंने कुछ समय पहले टोरनाडो फ्रेमवर्क सीखना शुरू कर दिया है। मुझे अनुभवहीन उपयोगकर्ताओं के लिए प्रलेखन की कमी का सामना करना पड़ा है और एसिन्सीओ मॉड्यूल दस्तावेज़ भी चेक किया गया है। तो समस्या यह है, कि मैं asyncio में कुछ सरल कोड है:टोरनेडो ढांचे। TypeError: 'भविष्य' ऑब्जेक्ट कॉल करने योग्य नहीं है

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

और फिर मैं एक ही का उपयोग कर तूफान ढांचा बनाने के लिए कोशिश की है:

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

लेकिन दुर्भाग्य से तूफान कोड इस तरह के एक बढ़ा अपवाद:

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 

शायद IOLoop एक नया "गोद" बनाने के लिए के बाद सभी coroutines उनके मूल्यों वापस आ गए की कोशिश करता है?

उत्तर

17

run_sync तर्क के रूप में एक फ़ंक्शन (या अन्य "कॉल करने योग्य") लेता है। आप फ़ंक्शन को जगह पर कॉल कर रहे हैं और फिर परिणाम को तर्क के रूप में दे रहे हैं। आप lambda:

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

का उपयोग कर एक अज्ञात फ़ंक्शन बना सकते हैं धन्यवाद क्लाउस! – Anton

संबंधित मुद्दे