首页 文章

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

提问于
浏览
2

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

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

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

1 回答

  • 2

    如果您希望处理上传的服务器处理后台作业,那么您根本不需要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())
    

相关问题