有没有办法判断asyncio事件循环是否已满负荷?

Dav*_*rks 6 python-multithreading python-asyncio python-3.6

我正在运行一个异步应用程序,该应用程序需要多个事件循环来服务大量的IO操作(同时进行上千个)。事件循环在单独的线程中运行,并在协程被提交时永久循环。

我正在寻找一种方法来识别现有事件循环何时接近满负荷,以便可以按需启动新的事件循环线程,而不是预先指定要运行的事件循环数。

接近容量意味着事件循环在80%的时间内忙碌。如果事件循环在等待状态下花费的时间少于其时间的20%,那么该添加另一个事件循环线程了。

每个线程似乎都不是那么容易:通过线程分析Python CPU使用情况

use*_*342 2

我正在寻找一种方法来识别现有事件循环何时接近满负荷,以便我可以启动新的事件循环线程

由于GIL的原因,我认为这种方法行不通。您似乎描述的用例是由于 CPU 过载而导致事件循环停止的用例。如果是这种情况,添加更多线程不会有任何帮助,因为 CPU 工作(除了极少数例外)在 Python 中不是并行的。

如果您的事件循环执行了太多与 CPU 相关的工作(例如计算),您应该使用 . 将这些单独的工作单元移动到单独的线程中run_in_executor。如果这还不够,您可以尝试切换到uvloop,这是 CPython 的高性能 asyncio 直接替代品。您还可以尝试使用PyPy进行 asyncio 。

如果这些选项都不起作用,那么接下来要尝试的是多处理的某种变体。(或者更底层/面向性能的语言。)