【发布时间】:2020-01-29 11:05:37
【问题描述】:
我正在开发一个烧瓶应用程序,它不断检查来自 AWS SQS 队列的新消息并接收它们。为此,我编写了一个可以由端点触发的函数。 -/start。为简单起见,在代码中,我没有发布从 SQS 队列接收消息的所有逻辑。只需打印日期时间并等待 3 秒。
如何在烧瓶服务器启动并准备好为请求提供服务后立即访问此端点?
是否有任何装饰器或其他东西可以使这成为可能?
quque_services.py:
from datetime import datetime
import time
def receive_messages():
print(datetime.now())
time.sleep(3)
__init__.py:
from flask import Flask, request, jsonify
from app.workload.services.queue_services import receive_messages
def create_app(**kwargs):
app = Flask(__name__, **kwargs)
@app.route('/start')
def queue_receiver():
while True:
receive_messages()
return app
wsgi.py:
from app import create_app
application = create_app()
if __name__ == "__main__":
application.run()
【问题讨论】:
-
那你真的需要一个 Flask 应用吗?在我看来,如果你只是在
main块中调用receive_messages,它就可以在不需要 HTTP 服务器的情况下工作。 -
我还需要提供 API 以根据被命中的端点管理此
receive_messages功能。 -
这里的问题是
while循环会阻塞HTTP服务器。 IMO,这应该是两个独立的应用程序(Flask 应用程序将接受 HTTP 请求以发布新消息,另一个专用于接收和处理消息)。如果您不想这样做,也许您可以像这里描述的那样启动一个子流程:stackoverflow.com/questions/28800614/… -
我同意 HTTP 服务器因该请求而被阻止。我只需要在服务器启动后点击它。现在我需要手动点击端点。并且正在打印
datetime。随着datetime正在控制台上打印,其他 API 正在无任何阻塞地提供服务。 -
作为 http 服务器旁边的celery 应用程序会不会更好?我同意@frankie567 的观点,在 API 的端点上有一个像这样的连续循环是一个奇怪的设计结构——为什么不把这个过程单独运行到烧瓶组件呢?
标签: python api flask amazon-sqs wsgi