【发布时间】:2019-01-08 22:15:54
【问题描述】:
是否有测量 asyncio 事件循环指标的模块?或者对于异步事件循环,我们应该监控哪些指标来进行性能分析?
例如
- 事件循环中有多少个任务?
- 有多少任务处于等待状态?
我不是要测量协程函数。 aiomonitor 有这个功能,但不是我需要的。
【问题讨论】:
是否有测量 asyncio 事件循环指标的模块?或者对于异步事件循环,我们应该监控哪些指标来进行性能分析?
例如
我不是要测量协程函数。 aiomonitor 有这个功能,但不是我需要的。
【问题讨论】:
我几乎不相信待处理任务或任务摘要的数量会告诉你很多。假设您有 10000 个任务,其中 8000 个待处理:是不是很多,不是吗?谁知道呢。
问题是 - 每个 asyncio 任务(或任何其他 Python 对象)可以消耗不同数量的不同机器资源。
与其尝试监控 asyncio 特定对象,我认为监控一般指标会更好:
对于asyncio,您可能应该始终使用asyncio.Semaphore 来限制当前正在运行的作业的最大数量,并实施一种方便的方法来更改信号量的值(例如,通过配置文件)。
它将允许根据具体机器的可用资源和实际使用的资源来改变具体机器上的工作负载。
更新:
我的问题,在此期间 asyncio 是否仍会接受新连接 屏蔽?
如果您的事件循环被某些 CPU 计算阻塞,asyncio 将在稍后开始处理新连接 - 当事件循环再次空闲时(如果此时它们没有超时)。
您应该始终避免冻结事件循环的情况。冻结某处事件循环意味着代码中各处的所有任务也被冻结!无论任务数量如何,任何类型的循环冻结都会破坏使用异步方法的整个想法。冻结事件循环的任何类型的代码都会出现性能问题。
如您所述,您可以使用 ProcessPoolExecutor 和 run_in_executor 来等待 CPU 绑定的内容,但您也可以使用 ThreadPoolExecutor 来避免冻结。
【讨论】: