简体   繁体   中英

Calling Tornado Coroutine from asyncio

My main event loop uses asyncio but needs to call a library method that is a coroutine of type tornado.concurrent.Future . Attempting to await on the coroutine fails with RuntimeError .

RuntimeError: Task got bad yield: <tornado.concurrent.Future object at 0x7f374abdbef0>

Documentation and searches have suggested upgrading the version of Tornado (currently using 4.5) or using method tornado.platform.asyncio.to_asyncio_future which no longer produces a RuntimeError but instead just hangs on await . I'm curious to know if someone can explain what is happening. There are two main methods, one with asyncio calling a Tornado coroutine and another that is purely Tornado which works as expected.

import asyncio
from tornado import gen
from tornado.platform.asyncio import to_asyncio_future


async def coro_wrap():
    tornado_fut = coro()
    
    print(f'tornado_fut = {tornado_fut}, type({type(tornado_fut)})')
    
    async_fut = to_asyncio_future(tornado_fut)
    print(f'async_fut = {async_fut}')
               
    res = await async_fut
    print(f'done => {res}')


@gen.coroutine
def coro():
    print('coro start')
    yield gen.sleep(3)
    print('coro end')    
    return 'my result'


def main():    
    loop = asyncio.get_event_loop()
    
    task = loop.create_task(coro_wrap())    
    loop.run_until_complete(task)
    
    print('end')
    
    
def main2():
    from tornado import ioloop
    loop = ioloop.IOLoop()
    res = loop.run_sync(coro)
    print(res)


if __name__ == '__main__':
    main()

Output from main

coro start
tornado_fut = <tornado.concurrent.Future object at 0x7f41493f1f28>, type(<class 'tornado.concurrent.Future'>)
async_fut = <Future pending>

Output from main2

coro start
coro end
my result

In new versions of Tornado, this just works.

In old versions of tornado you must both use to_asyncio_future and at startup call tornado.platform.asyncio.AsyncIOMainLoop.install() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM