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

时间:2015-08-28 13:37:47

标签: python flask celery distributed-computing

我有一个设置,其中有多个服务器同时运行我的Flask应用程序和Celery worker。 Flask路由在本地处理文件上载并将Celery任务排队以将该文件上载到CDN。

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

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

1 个答案:

答案 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())
相关问题