python - 在处理 Flask 请求的同一服务器上运行 Celery 任务

标签 python flask celery distributed-computing

我设置了多个服务器,同时运行我的 Flask 应用程序和 Celery 工作线程。 Flask 路由在本地处理文件上传,并对 Celery 任务进行排队以将该文件上传到 CDN。

Celery 任务可以由集群中的任何节点处理。如果 Celery 任务由与处理 Flask 路由的节点不同的节点处理,则将找不到该文件并且任务将失败。

如何确保 Celery 任务在处理 Flask 路由的同一节点上运行?

最佳答案

如果您希望处理上传的服务器处理后台作业,那么您根本不需要 Celery。当您需要分发和排队任务时,Celery 是很好的选择,但您所描述的内容是本地的,并且是在上传之后立即进行的。

无需使用 Celery 任务,只需在本地生成一个进程来处理后台作业。

from multiprocessing import Process
from flask import Flask, render_template, request, redirect

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        f = request.files['file']
        Process(target=handle_file, args=(f,)).start()
        return redirect(request.path)

    return render_template('upload.html')

def handle_file(f):
    print(f.read())

if __name__ == '__main__':
    app.run('localhost')

如果您想坚持使用 Celery,您可以放弃在本地保存文件并将文件数据作为参数传递给任务,因此无论哪台服务器处理上传,处理任务的服务器始终会拥有数据。如果文件很大,可能会出现性能问题。

@celery.task
def upload(data):
    ...

upload.delay(file.read())

关于python - 在处理 Flask 请求的同一服务器上运行 Celery 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272418/

相关文章:

python - 使用 Popen 减少控制

python - 通过 Flask 应用程序进行 Sentry 日志记录

python - 当内部函数返回可能是 'Union' 的 'None' 时,如何避免类型错误?

python - 在 Docker 中运行的 Flask 应用程序找不到模板

django - Ubuntu 服务 Upstart 或 SystemD,Django 开发服务器即服务

python - 从 QLineEdit 中提取文本

python - 使用cors的Azure Python Flask应用程序在部署时似乎没有安装requirements.txt?

django - Postgres : prioritize main application over background celery jobs

python - 修改 Celery 节拍计划搁置数据库

python - 无法在同一服务器上运行 2 个不同的 Flask 应用程序