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

Python 在处理Flask请求的同一服务器上运行芹菜任务,python,flask,celery,distributed-computing,Python,Flask,Celery,Distributed Computing,我有一个多服务器运行我的烧瓶应用程序和芹菜工人的设置。Flask路由在本地处理文件上载,并将芹菜任务排队以将该文件上载到CDN 芹菜任务可以由集群中的任何节点处理。如果芹菜任务由不同于处理Flask路由的节点处理,则将找不到该文件,并且任务将失败 如何确保芹菜任务在处理烧瓶路由的同一节点上运行?如果希望处理上载的服务器处理后台作业,则根本不需要芹菜。芹菜在您需要分发和排队任务时很好,但您描述的是本地的,并且是在上传之后立即进行的 与芹菜任务不同,只需在本地生成一个进程来处理后台作业 from m

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

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


如何确保芹菜任务在处理烧瓶路由的同一节点上运行?

如果希望处理上载的服务器处理后台作业,则根本不需要芹菜。芹菜在您需要分发和排队任务时很好,但您描述的是本地的,并且是在上传之后立即进行的

与芹菜任务不同,只需在本地生成一个进程来处理后台作业

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.task
def upload(data):
    ...

upload.delay(file.read())