python - 使用 gunicorn 异步运行长轮询烧瓶应用程序
问题描述
我正在尝试运行一个轮询 AWS SQS 队列的烧瓶应用程序,我要求该应用程序持续轮询并异步响应客户端请求,但是我发现该应用程序在轮询时被阻止。
我读过其他关于使用 gevent 的帖子,但我似乎无法让它工作。
用于运行应用程序的命令,
gunicorn src.app:app \
--bind 0.0.0.0:8081 \
--timeout 127 \
-k gevent --worker-connections=2000
应用程序代码,
from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from src import security
from src.config import config
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = config.pg_url
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)
app.wsgi_app = ProxyFix(app.wsgi_app)
from src.app import routes
from src.app.services.sqs.queue import SQSQueue
from src.app.services.sqs.message_processor import MessageProcessor
if config.group == 'JobServer':
SQSQueue.poll(MessageProcessor)
投票代码,
def poll(action):
while True:
try:
message = self.get_message()
if message is None:
time.sleep(5)
else:
# do something
except Exception:
pass
解决方案
使用 gevent worker 是不够的。您还需要在代码中使用它。对于您的代码,修补 IO 库可能就足够了。
为了简单起见,我通常会monkey.patch_all()
在我的导入中尽早使用。
例如,在您的应用程序导入中,我会将其放在顶部,如下所示
# Use gevent to patch IO modules as soon as possible.
from gevent import monkey; monkey.patch_all()
from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from src import security
from src.config import config
推荐阅读
- tcp - 我想检查超时响应
- java - 使用 Spring Boot 和 Liquibase 时如何在每次集成测试后清理数据库表?
- c++ - 复制几乎为空的数组的最快方法
- c# - 如何在 Xamarin 中指定哈希算法?
- google-cloud-platform - GCP 私有集群的 Terraform 代码不起作用
- c# - 无法获取 JSON.NET 架构来查找我的外部引用的 JSON 架构文件
- dns - Azure URL 不适用于新的 CNAME 条目
- node.js - Angular 10 如何修复警告:(节点:27976) ExperimentalWarning:fs.promises API 是实验性的
- python - 目前如何在 Pygame 中播放视频?
- flutter - Flutter statelessWidget 初始化 viewModel