gevent

建议使用带有 gevent worker 的 GunicornuWSGI,而不是直接使用 gevent。Gunicorn 和 uWSGI 提供了更易配置、经过生产验证的服务器。

gevent 允许你编写异步的、基于协程的代码,其风格类似标准的同步 Python。它使用 greenlet 来实现任务切换,无需编写 async/await 或使用 asyncio

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

gevent 提供了一个 WSGI 服务器,它可以同时处理多个连接,而不是每个 worker 进程仅处理一个连接。要想从该服务器中受益,必须在你自己的代码中实际使用 gevent。

安装

使用 gevent 时,要求 greenlet 版本不低于 1.0,否则类似 request 这样的上下文局部变量将无法正常工作。使用 PyPy 时,要求 PyPy 版本不低于 7.3.7。

请先创建一个虚拟环境,安装你的应用程序,然后再安装 gevent

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

运行

若要使用 gevent 来提供应用服务,请编写一个脚本,导入 WSGIServer 和你的应用实例或应用工厂函数。

wsgi.py
from gevent.pywsgi import WSGIServer
from hello import create_app

app = create_app()
http_server = WSGIServer(("127.0.0.1", 8000), app)
http_server.serve_forever()
$ python wsgi.py

当服务器启动时不会有任何输出。

外部绑定

不应以 root 用户运行 gevent,因为这会导致你的应用代码也以 root 身份运行,这是不安全的。然而,这也意味着无法绑定到 80 或 443 端口。因此,应在 gevent 前面使用反向代理,例如 nginxApache httpd

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

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