Торнадо. TypeError: объект "Будущий" не может быть вызван

Я начал изучать структуру Tornado когда-то. Я столкнулся с отсутствием документации для неопытных пользователей и проверил также документы модуля asyncio. Поэтому проблема заключается в том, что у меня есть простой код в asyncio:

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

И затем я попытался сделать то же самое с использованием инфраструктуры 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))

Но, к сожалению, код Tornado вызывает такое исключение:

 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 пытается создать новый "круг" после того, как все сопрограммы вернут свои значения?

Ответ 1

run_sync принимает в качестве аргумента функцию (или другое "вызываемое" ). Вы вызываете функцию на месте, а затем даете результат в качестве аргумента. Вы можете создать анонимную функцию, просто используя lambda:

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