我遇到了调用 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()
转换为协程(在 def
之前添加 async
) ,在api.say()
之前添加await
)。
否则,您可以调用 asyncio.ensure_future(api.say(..))
来调度协程。它假设 loop.run_until_complete(api.run())
在 api.say()
完成之前不会返回,即 loop.run_forever( )
在您的程序中等效,或者您等待所有任务 - 显式或隐式收集 (asyncio.Task.all_tasks()
)。
关于python - 在事件流之外运行 asyncio 协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34641341/