Python Eventlet 如何并发请求?

客户端使用 eventlet,代码如下:

import eventlet
import urllib.request

urls = [
    "http://localhost:5000/",
    "http://localhost:5000/",
    "http://localhost:5000/",
]


def fetch(url: str) -> str:
    return urllib.request.urlopen(url).read()


pool = eventlet.GreenPool(1000)
for body in pool.imap(fetch, urls):
    print("got body", len(body), body)

服务端使用 fastapi 搭建,为什么可以区分客户端是否真的并发请求了,我们加上一个延迟

from fastapi import FastAPI
import uvicorn
import time

app = FastAPI()


@app.get('/')
def root():
    time.sleep(3)
    return {"message": "Hello World"}


if __name__ == '__main__':
    uvicorn.run("api:app", host="0.0.0.0", port=5000)

先启动服务端,然后再跑一下客户端的代码,使用 Linuxtime 命令来看耗时:

got body 25 b'{"message":"Hello World"}'
got body 25 b'{"message":"Hello World"}'
got body 25 b'{"message":"Hello World"}'
python -u "013.py"  0.25s user 0.01s system 2% cpu 9.276 total

可以看到,一共耗时 9 秒,而不是 3 秒,所以这个 eventlet 并没有并行,是我用错了吗?正确的打开方式是什么?

阅读 1.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题