如何衡量python asyncio事件循环指标?

时间:2019-01-08 22:15:55

标签: python-asyncio metrics

是否有一个用于测量异步事件循环指标的模块?还是异步事件循环,我们应该监视哪些指标以进行性能分析?

例如

  • 事件循环中有多少个任务?
  • 在等待状态下有多少个任务?

我不是要测量协程功能。 aiomonitor具有功能,但并非我所需要的。

1 个答案:

答案 0 :(得分:0)

我几乎不相信待处理任务的数量或任务摘要会告诉您很多信息。假设您有10000个任务,其中有8000个待处理:是很多,不是吗?谁知道。

事实是-每个asyncio任务(或任何其他Python对象)可以消耗不同数量的不同机器资源。

我认为最好监视常规指标,而不是监视asyncio特定对象:

  • CPU使用率
  • RAM使用情况
  • 网络I / O(如果您正在处理)
  • 硬盘驱动器I / O(如果您要处理的话)

asyncio的后果是,您应该始终使用asyncio.Semaphore来限制当前正在运行的作业的最大数量,并实现一种方便的方式来更改信号量的值(例如,通过配置文件)

这将允许根据具体计算机的可用和实际使用的资源来改变其工作量。

更新:

  

我的问题,在此期间asyncio是否仍会接受新连接   阻止?

如果您的事件循环被某些CPU计算所阻止,则asyncio将在以后开始处理新的连接-当事件循环再次空闲时(如果此时它们没有超时)。

您应该始终避免冻结事件循环的情况。冻结事件循环的位置意味着代码中所有位置的所有任务也会被冻结!任何类型的循环冻结都打破了使用异步方法的整个思路,而与任务数无关。冻结事件循环的任何类型的代码都会出现性能问题。

如前所述,可以将ProcessPoolExecutorrun_in_executor一起使用来等待CPU绑定的内容,但是也可以使用ThreadPoolExecutor来避免冻结。