eventlet¶
推荐使用带有 eventlet 工作进程的 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 前面使用反向代理,例如 nginx 或 Apache httpd。
您可以使用上一节中服务器参数中显示的 0.0.0.0
绑定到非特权端口上的所有外部 IP。当使用反向代理设置时,请勿这样做,否则可能会绕过代理。
0.0.0.0
不是一个有效的导航地址,您应该在浏览器中使用特定的 IP 地址。