eventlet

优先使用 Gunicorn 和 eventlet 工作进程,而不是直接使用 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 绑定到非特权端口上的所有外部 IP。在使用反向代理设置时不要这样做,否则将有可能绕过代理。

0.0.0.0 不是一个有效的导航地址,你将在浏览器中使用一个特定的 IP 地址。