Запуск 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()).

Другие вопросы по тегам