我有一个设置,多个服务器运行我的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())
1 回答
如果您希望处理上传的服务器处理后台作业,那么您根本不需要Celery . 当您需要分发和排队任务时,Celery很好,但您描述的内容是本地的,并且在上传后立即生效 .
而不是Celery任务,只是在本地生成一个进程来处理后台作业 .
如果您想坚持使用Celery,您可以放弃在本地保存文件并将文件数据作为参数传递给任务,因此无论哪个服务器处理上传,处理任务的服务器都将始终拥有数据 . 如果文件很大,可能会出现性能问题 .