我设置了多个服务器,同时运行我的 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/