与其使用带 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 来运行,这样 做是不安全的。然而,如果不以 root 运行,那么就不能绑定 80 或者 443 端口。所以在 eventlet 前应当设置一个反向代理,如 nginx 或者 Apache httpd 。
你可以通过前述的在服务器参数中使用 0.0.0.0
来把所有外部 IP 绑定到
一个非特权端口。但是当使用反向代理设置时,请不要这么做,否则可以会绕过
代理。
0.0.0.0
不是一个有效的导航地址,你应该在浏览器中使用一个特定的 IP
地址。
讨论区