为什么使用 Gevent 池来管理服务器中的 Greenlet 连接?

Why Use Gevent Pool to Manage Greenlet Connections in a Server?

我正在使用一个 Python 服务器,它为每个与服务器的连接生成一个 greenlet。目前,服务器不使用 greenlet 池。虽然我的预感是使用池会提高性能(主要是响应时间和每秒请求吞吐量),但在我实施 greenlets 池的反复试验中,似乎没有比仅使用更多的性能优势Gevent.spawn() 每个 greenlet/connection.

我在服务器上看到了this question, which is helpful, although I am curious about the application of a greenlet pool, like Gevent Pool,。这是一个有用的模式,一个线程池吗?或者,在服务器的情况下使用池是否无关紧要,因为与线程相比,Greenlets 是如此轻量级?

Greenlets 是轻量级的,但它们确实消耗内存。因此,即使一个进程可以支持的 greenlet 数量远大于 OS 可以支持的线程数量,它们仍然需要付出代价。因此,池仍然是限制可以生成的 greenlet 数量的有用工具 - 但它的大小最好设置得比实际线程的限制大得多。

此外,由于它们的协作多任务处理性质,每个请求的延迟(假设每个新请求都由一个新的 greenlet 处理)会随着 greenlet 数量的增加超过某个阈值而开始上升。在一次允许更多请求和在每个请求需要越来越多的时间才能完成时创建糟糕的用户体验之间需要权衡。有时最好限制传入负载并拒绝新请求 - 池是一种有用的方法。