gevent

推荐使用带有 gevent 工作进程的 GunicornuWSGI,而不是直接使用 gevent。 Gunicorn 和 uWSGI 提供了配置性更强且经过生产环境测试的服务器。

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

eventlet 是另一个做同样事情的库。 您拥有的某些依赖项或其他考虑因素可能会影响您选择使用哪一个。

gevent 提供了一个 WSGI 服务器,它可以一次处理多个连接,而不是每个工作进程一个连接。 您必须在自己的代码中实际使用 gevent 才能看到使用该服务器的任何好处。

安装

当使用 gevent 时,需要 greenlet>=1.0,否则像 request 这样的上下文局部变量将无法按预期工作。 当使用 PyPy 时,需要 PyPy>=7.3.7。

创建一个 virtualenv,安装您的应用程序,然后安装 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

当服务器启动时,不会显示任何输出。

外部绑定

gevent 不应以 root 身份运行,因为它会导致您的应用程序代码以 root 身份运行,这不安全。 但是,这意味着将无法绑定到端口 80 或 443。 相反,应该在 gevent 前面使用反向代理,例如 nginxApache httpd

您可以使用上一节中显示的服务器参数中的 0.0.0.0 绑定到非特权端口上的所有外部 IP。 当使用反向代理设置时,请勿这样做,否则可能会绕过代理。

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