2016-09-30 12 views
0

Я пытаюсь использовать prompt_toolkit из приложения, которое использует цикл событий торнадо, но я не могу правильно сформулировать приглашение prompt_toolkit к циклу событий.Как я могу вызвать prompt_toolkit из цикла событий торнадо?

Документация prompt_toolkit есть пример его использования в asyncio (Asyncio Docs):

from prompt_toolkit.shortcuts import prompt_async 

async def my_coroutine(): 
    while True: 
     result = await prompt_async('Say something: ', patch_stdout=True) 
     print('You said: %s' % result) 

мне удалось сделать эту работу с asyncio цикла событий:

import asyncio 
l = asyncio.get_event_loop() 
l.create_task(my_coroutine()) 
l.run_forever() 

Say something: Hello 
You said: Hello 

Однако, у меня есть не удалось заставить его работать из цикла событий торнадо. Я пробовал следующее:

from tornado.ioloop import IOLoop 
IOLoop.current().run_sync(my_coroutine) 

Это произведет начальное приглашение, но затем будет заблокировано консоль.

Я также попытался:

IOLoop.current().add_callback(my_coroutine) 
IOLoop.current().start() 

Это делает то же самое, но и выдает сообщение об ошибке:

RuntimeWarning: coroutine 'my_coroutine' was never awaited 

И я попробовал:

IOLoop.current().spawn_callback(my_coroutine) 
IOLoop.current().start() 

Я явно не понимая чего-то здесь.

Может ли кто-нибудь осветить, как это сделать?

Я использую: Python 3.5.0, торнадо 4.3.

ответ

0

Чтобы использовать Tornado's asyncio integration, вы должны сообщить Tornado, чтобы использовать цикл событий asyncio. Обычно это означает, что это делается в начале вашего приложения:

from tornado.platform.asyncio import AsyncIOMainLoop 
AsyncIOMainLoop().install()