2016-01-06 5 views
1

У меня проблемы, когда мой звонок api.say() не удался. Я понимаю его coroutine и должен быть уступлен, но это действительно, если моя print_all является стандартной функцией.Запуск asyncio coroutine из потока событий

Каков правильный способ структурирования этого примера?

Предположим, что Клиент не подлежит изменению, только код в моем примере.

from .client import Client 
import asyncio 

api = Client() 
login = ('', '') 

def print_all(b=None, m=None): 
    print("Buffer!", b) 
    print("Message", m) 

    if b and m: 
     if b.name == 'bat': 
      print("-sending to", b) 
      api.say(b, "Hey yo."): # <---- 


def main(): 
    api.login(*login) 
    api.register_message_callback(print_all) 
    api.register_state_callback(print_all) 

    loop = asyncio.get_event_loop() 
    loop.run_until_complete(api.run()) 
    loop.close() 

if __name__ == '__main__': 
    main() 

ответ

1

Клиента API может обрабатывать обратные вызовы, которые сопрограмма тоже есть, вы можете конвертировать print_all() в сопрограммы (PREPEND async перед тем def добавить await перед тем api.say()).

В противном случае вы можете позвонить asyncio.ensure_future(api.say(..)), чтобы запланировать сопрограмму. Предполагается, что loop.run_until_complete(api.run()) не вернется до api.say(), т. Е. В вашей программе эквивалент loop.run_forever() или вы ожидаете выполнения всех заданий - либо явно или неявно, (asyncio.Task.all_tasks()).

+0

Спасибо 'asyncio.ensure_future (api.say (..))' исправлена ​​проблема. Мой клиент не обрабатывал обратные вызовы как сопрограммы, поэтому '.ensure_future (...)' отсортировал его. – PsyKzz

Смежные вопросы