运行 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
,添加 await
在 api.say()
之前)。
否则,您可以调用asyncio.ensure_future(api.say(..))
来安排协程。它假定 loop.run_until_complete(api.run())
在 api.say()
完成之前不会 return 即,在您的程序中有 loop.run_forever()
等价物,或者您等待所有任务 - 显式或隐式收集(asyncio.Task.all_tasks()
).
我遇到了问题,我对 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
,添加 await
在 api.say()
之前)。
否则,您可以调用asyncio.ensure_future(api.say(..))
来安排协程。它假定 loop.run_until_complete(api.run())
在 api.say()
完成之前不会 return 即,在您的程序中有 loop.run_forever()
等价物,或者您等待所有任务 - 显式或隐式收集(asyncio.Task.all_tasks()
).