Запуск asyncio сопрограммы из потока событий
У меня возникли проблемы, когда мой звонок api.say()
выходит из строя. Я понимаю, что это сопрограмма и должна быть получена, но это действительно, если мой print_all
это стандартная функция.
Как правильно структурировать этот пример?
Пожалуйста, предположите, что Клиент не подлежит изменению, только код в моем примере.
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()
в сопрограмму 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()
).