ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Flask 如何启用 gevent 补丁处理高并发连接并配合 Gunicorn 或 uWSGI 部署

Flask 如何启用 gevent 补丁处理高并发连接并配合 Gunicorn 或 uWSGI 部署 Flask 如何启用 gevent 补丁处理高并发连接并配合 Gunicorn 或 uWSGI 部署【免费下载链接】flaskThe Python micro framework for building web applications.项目地址: https://gitcode.com/gh_mirrors/fl/flask当你的 Flask 应用需要处理大量长时间保持的并发连接时Flask 官方文档给出了 gevent 这条路径gevent 通过打补丁的方式改造 Python 标准库让代码运行在名为 greenlet 的异步 worker 中从而在不写async def或await的前提下处理许多并发连接。官方同时建议在部署时使用 Gunicorn 或 uWSGI 的 gevent worker而不是直接用 gevent 自带的 WSGI server因为这两个服务器在配置能力和生产验证上更成熟。本文的操作路径是在应用入口尽早应用 gevent monkey patch然后分别演示用 Gunicorn 和 uWSGI 的 gevent worker 启动服务并说明对外绑定与反向代理的限制。环境要求来自 gevent 文档页使用 gevent 时需要 greenlet1.0如果运行在 PyPy 上需要 PyPy7.3.7。在应用入口启用 gevent monkey patchgevent 的补丁需要尽早应用它会启用 gevent 底层事件循环并把 Python 的许多内部实现转换到其中运行。官方文档要求在项目模块或顶层__init__.py的最上方加入以下代码见 docs/gevent.rstimport gevent.monkey gevent.monkey.patch_all()注意gevent.monkey.patch_all()必须位于模块顶部、其他 import 之前这是尽早打补丁要求的直接体现。如果你的代码需要在 gevent 内部并发执行任务例如在视图中异步发送邮件文档示例使用gevent.spawn()app.post(/send) def send_email(): gevent.spawn(email.send, toexampleexample.example, textexample) return Email is being sent.这里有一个上下文限制如果需要在 spawn 出的函数中访问request等 Flask 上下文全局变量要使用stream_with_context或copy_current_request_context装饰该函数文档建议优先在 spawn 时直接传入需要的数据而不是使用这些装饰器。安装 gevent 与服务器以下命令组合自 gevent 部署页 和 Gunicorn 部署页。hello-app与hello都是文档中的示例应用名替换为你的项目目录和应用模块名$ cd hello-app $ python -m venv .venv $ . .venv/bin/activate $ pip install . # install your application $ pip install gevent $ pip install gunicorn如果选择 uWSGI 路径则改为安装pyuwsgi提供常见平台的预编译 wheel但不含 SSL 支持可用反向代理提供 SSL。有编译器的话也可以安装uwsgi包或用pip install --no-binary pyuwsgi pyuwsgi从 sdist 安装两种方式都包含 SSL 支持。uWSGI 与 Gunicorn 一样不支持 Windows但可以在 WSL 下运行。用 Gunicorn 的 gevent worker 部署Gunicorn 的默认 sync worker 适用于大多数场景当需要大量长连接并发时使用 gevent 异步 worker。启动命令的语法是{module_import}:{app_variable}module_import是应用所在模块的导入名app_variable是应用变量使用工厂模式时也可以写成函数调用。$ gunicorn -k gevent hello:create_app()文档给出的启动输出示例具体版本号随安装的 Gunicorn 而不同Starting gunicorn 20.1.0 Listening at: http://127.0.0.1:8000 (x) Using worker: gevent Booting worker with pid: x看到Using worker: gevent说明 gevent worker 已生效这是文档示例输出不是必须逐字匹配的固定日志。常用选项-w 4worker 进程数文档建议的起始值可以是CPU * 2默认只有 1 个 worker对默认 worker 类型来说通常不是你想要的值。gevent worker 场景下可结合自身连接量调整。--access-logfile-在标准输出显示每个请求的访问日志默认只显示 worker 信息和错误。-b 0.0.0.0绑定所有外部 IP 的非特权端口。文档同时提醒如果前面有反向代理不要这样做否则请求可以绕过代理。用 uWSGI 的 gevent worker 部署可选替代路径uWSGI 同样提供基于 gevent 的异步 worker。基本的启动方式同步模式是$ uwsgi --http 127.0.0.1:8000 --master -p 4 -w hello:app切换到 gevent worker 时改用--gevent参数$ uwsgi --http 127.0.0.1:8000 --master --gevent 100 -w wsgi:app其中--http 127.0.0.1:8000启动 HTTP 服务器--master指定标准的 worker 管理器-w指定如何导入应用wsgi:app指向wsgi.py中的app对象使用工厂模式时文档的做法是写一个小wsgi.py创建 app 再指向它。-p 4是同步模式下启动 4 个 worker 进程文档建议起始值可以是CPU * 2。文档给出的 gevent 模式启动输出示例*** Starting uWSGI 2.0.20 (64bit) on [x] *** *** Operational MODE: async *** mounting hello:app on / spawned uWSGI master process (pid: x) spawned uWSGI worker 1 (pid: x, cores: 100) spawned uWSGI http 1 (pid: x) *** running gevent loop engine [addr:x] ***Operational MODE: async与running gevent loop engine表明 gevent 循环已启用。以上为文档示例输出实际版本号和 pid 会有差异。对外绑定与反向代理三个服务器页面Gunicorn、uWSGI、gevent给出了一致的部署约束不要以 root 运行否则应用代码会以 root 身份执行不安全。不运行 root 意味着无法绑定 80 或 443 端口应使用 nginx 或 apache-httpd 这类反向代理放在服务器前面。用0.0.0.0Gunicorn 的-b 0.0.0.0、uWSGI 的--http 0.0.0.0:8000、gevent 的 server 参数可以绑定所有外部 IP 的非特权端口但配置反向代理时不要这么做否则代理会被绕过。0.0.0.0本身不是可访问的地址浏览器中要用具体 IP 访问。限制与已知问题gevent 与 Flask 的 asyncio 支持不能直接共存gevent 的打补丁与 Flask 内置的 asyncio 支持配合不好。若确实要在同一个应用里同时使用文档的做法是重写Flask.async_to_sync在 gevent 中启动一个 asyncio 事件循环再把 async 函数调度到该循环上。文档同时提醒这种方式仍有限制使用其他 asyncio 实现时可能还需要修改。libuv 事件循环如果要用 libuv应使用 gevent 的支持而不是 uvloop。启用方式是在gevent.monkey.patch_all()之前加import gevent gevent.config.loop libuv import gevent.monkey gevent.monkey.patch_all()不要直接用 gevent 自带服务器做生产部署docs/deploying/gevent.rst 中虽然演示了用gevent.pywsgi.WSGIServer写wsgi.py直接服务的方式注意其启动时没有任何输出但该页明确建议优先使用 Gunicorn 或 uWSGI 的 gevent worker。本文主路径即采用后者。gevent 的并发能力依赖 gevent 与 greenlet 对 Python 解释器的底层操作它不是 Python 的async/await也不是 ASGI 服务器规范文档建议根据项目具体需求决定是否使用 gevent或 Quart 等替代方案。【免费下载链接】flaskThe Python micro framework for building web applications.项目地址: https://gitcode.com/gh_mirrors/fl/flask创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表