从事件流中运行asyncio协同程序

时间:2016-01-06 19:36:36

标签: python python-3.x coroutine python-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 个答案:

答案 0 :(得分:1)

客户端API也可以处理协同程序的回调,即,您可以将print_all()转换为协程(async之前的前defawait之前添加api.say() }})。

否则,您可以致电asyncio.ensure_future(api.say(..))来安排协程。它假设loop.run_until_complete(api.run())api.say()完成之前不会返回,即在您的程序中有loop.run_forever()等效或等待所有任务 - 显式或隐式收集({{1} }})。