首页 > 解决方案 > 在 Python3.6 脚本中间使用 asyncio

问题描述

我有一个 Python 任务,它使用具有 1 个或多个与之关联的处理程序的状态更新程序报告它在执行过程中的进度。我希望以异步方式将更新分派给每个处理程序(每个处理程序负责对更新进行 I/O 绑定调用、推送到队列、记录到文件、调用 HTTP 端点等)。状态更新器有一个类似的方法,每个handler.dispatch方法都是一个协程。这一直有效,直到添加了使用 aiohttp 的处理程序,现在我从 aiohttp 模块收到奇怪的错误。

def _dispatch(self, **updates):
    event_loop = asyncio.get_event_loop()
    tasks = (event_loop.create_task(handler.dispatch(**updates)) for handler in self._handlers)
    event_loop.run_until_complete(asyncio.gather(*tasks))

我见过的每个 asyncio 示例基本上都有这种模式

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

我的问题是,在这种情况下我尝试使用 asyncio 模块的方式完全错误吗?事件循环是否需要创建一次且只创建一次,然后其他所有内容都通过它?

标签: pythonpython-asyncio

解决方案


推荐阅读