我遇到的问题是我对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()
答案 0 :(得分: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()
等效或等待所有任务 - 显式或隐式收集({{1} }})。