运行 asyncio协程脱离事件流

Running asyncio coroutine out of the event flow

我遇到了问题,我对 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()

客户端 API 也可能处理协同程序的回调,即,您可以将 print_all() 转换为协同程序(在 [=12= 之前添加 async,添加 awaitapi.say() 之前)。

否则,您可以调用asyncio.ensure_future(api.say(..))来安排协程。它假定 loop.run_until_complete(api.run())api.say() 完成之前不会 return 即,在您的程序中有 loop.run_forever() 等价物,或者您等待所有任务 - 显式或隐式收集(asyncio.Task.all_tasks()).