我正在使用Python协程库gevent和monkey补丁来增加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秒。为什么会这样?
greenlet 仍然是单线程的,这意味着它们一次只能做一件事。 对于任何占用大量 CPU 资源的进程,这都会导致延迟。 是的,它是异步的,但它不是多处理的,所以如果某些东西使用 1 秒的 CPU,你已经将任何后续绿点的结果延迟了 1 秒。
因此,随着队列的增长,即使只是毫秒,延迟也会变得明显。