python - 在事件流之外运行 asyncio 协程

标签 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()

最佳答案

客户端 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/

相关文章:

python - 使用列表作为行中的值创建 Pandas 数据框

python-3.x - 如何在 OpenCV 中获取 VideoCapture 对象的 4 字符编解码器代码?

python - 从协程接收器写入 csv 文件...如何避免关闭文件错误?

python - 在 python 增强生成器中避免 "exception ignored"

python - SQL 时间戳默认当前时间戳 : How to remove miliseconds?

python - 如何让 Nose2 测试在 Visual Studio Code 上运行?

python - 在 Python 命令行参数中拆分长参数

python - 在 python 3.4 中使用正则表达式的语法无效

go - 并行获取多个字段的模式

Python Scrapy 和产量