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

Is there a way to tell if an asyncio event loop is at full capacity?

我正在 运行ning 一个 asyncio 应用程序,它需要多个事件循环来为大量 IO 操作(同时处理一千个以上)提供服务。事件在单独的线程中循环 运行,并在提交协程时永远循环。

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

接近容量意味着事件循环在 80% 以上的时间里保持忙碌。如果事件循环处于等待状态的时间少于 20%,则该添加另一个事件循环线程了。

似乎每个线程都不容易:Profile Python CPU Usage By Thread

I'm looking for a way to identify when an existing event loop is near full capacity so I can fire up a new event loop thread

我认为这种方法行不通,因为 GIL. The use case you seem to be describing is that of event loops stalling due to CPU overload. If that is the case, adding more threads won't help simply because CPU work is, except for ,未在 Python 中并行化。

如果您的事件循环正在做太多与 CPU 相关的工作(例如计算),您应该使用 run_in_executor. If that is not enough, you can try switching to uvloop, a high-performance asyncio drop-in replacement for CPython. You can also try asyncio with PyPy.

将这些单独的工作单元移动到单独的线程中

如果这些选项中的 none 有效,接下来要尝试的是多处理的一些变体。 (或更多 low-level/performance-oriented 语言。)

如果您想利用更多可用的机器资源,将此工作委托给管理多个 python 进程的外部 supervisor 会更容易。

在容量限制下生成更多进程听起来像是 load balancer 应该做的事情。

将这项工作委派给经过时间验证的解决方案似乎比在 Python(事实上)上编写自己的解决方案更好。我也对将应用程序业务逻辑与部署相关细节混合的想法持怀疑态度,这些细节可能会根据具体的服务器基础设施而改变。

aiohttp 有很好的 manual 基本部署过程。