我有一个设置,其中有多个服务器同时运行我的Flask应用程序和Celery worker。 Flask路由在本地处理文件上载并将Celery任务排队以将该文件上载到CDN。
Celery任务可以由群集中的任何节点处理。如果Celery任务由与处理Flask路由的节点不同的节点处理,则找不到该文件,任务将失败。
如何确保Celery任务在处理Flask路径的同一节点上运行?
答案 0 :(得分:3)
如果您希望处理上传的服务器处理后台作业,那么您根本不需要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())