为什么 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 的延迟也会变得很明显。
我正在使用 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 的延迟也会变得很明显。