为什么 greenlets 的数量会影响响应的经过时间

Why the amount of greenlets will impact the elapsed time of the responses

我正在使用 Python 协程库 gevent 和猴子补丁来增加 http 请求的并发性。但是我注意到响应的运行时间随着并发性的增加而增加。示例代码下方:

import gevent
from gevent import monkey
import requests

monkey.patch_all(thread=False)


def action():
    resp = requests.get("https://www.google.com")
    if resp.status_code == 200:
        print resp.elapsed.total_seconds()


jobs = []
for i in range(100):
    jobs.append(gevent.spawn(action))

gevent.joinall(jobs)

生成10个绿叶时,经过时间约为0.9秒,但当绿叶数量增加到100个时,经过时间约为1.6~2.0秒。为什么会这样?

greenlets 仍然是单线程的,这意味着它们一次只能做一件事。对于任何 cpu 密集的进程,这都会导致延迟。是的,它是异步的,但它不是多处理的,所以如果某些东西使用了 CPU 的 1 秒,那么你已经将任何后续 greenlet 的结果延迟了 1 秒。

因此,随着队列的增长,即使只有 ms 的延迟也会变得很明显。