eventlet

建议使用带有 eventlet worker 的 Gunicorn,而不是直接使用 eventlet。 Gunicorn 提供了更强的可配置性,并且是经过生产环境验证的服务器。

eventlet 允许你编写异步、基于协程的代码,并且代码风格看起来就像标准的同步 Python。 它使用 greenlet 实现任务切换,无需编写 async/await 或使用 asyncio

gevent 是另一个具有相同功能的库。 你使用的某些依赖或其他因素可能会影响你选择其中哪一个。

eventlet 提供了一个 WSGI 服务器,能够同时处理多个连接,而不是每个工作进程仅处理一个连接。 但要真正获得 eventlet 的好处,你必须在自己的代码中实际使用它。

安装

使用 eventlet 时需要安装 greenlet>=1.0,否则上下文变量(如 request)将无法正常工作。 如果使用 PyPy,则需要 PyPy>=7.3.7。

创建一个虚拟环境,安装你的应用,然后再安装 eventlet

$ cd hello-app
$ python -m venv .venv
$ . .venv/bin/activate
$ pip install .  # install your application
$ pip install eventlet

运行

要使用 eventlet 来运行你的应用,请编写一个脚本,导入其 wsgi.server,以及你的应用或应用工厂。

wsgi.py
import eventlet
from eventlet import wsgi
from hello import create_app

app = create_app()
wsgi.server(eventlet.listen(("127.0.0.1", 8000)), app)
$ python wsgi.py
(x) wsgi starting up on http://127.0.0.1:8000

外部绑定

eventlet 不应以 root 用户身份运行,因为这样会导致你的应用代码也以 root 身份运行,这是不安全的。 但这也意味着你无法绑定到 80 或 443 端口。 相反,应该在 eventlet 前面加一个反向代理,比如 nginxApache httpd

你可以通过传入 ``0.0.0.0``(在上一节的 server 参数中)绑定到所有外部 IP 的非特权端口。 如果你使用了反向代理,请不要这样做,否则可能绕过代理直接访问应用。

注意:0.0.0.0 不是一个可以在浏览器中访问的有效地址,浏览器中应使用具体的 IP 地址。