2
我有一個運行我的Flask應用程序和Celery工作者的多個服務器的設置。 Flask路由在本地處理文件上載,並將Celery任務排隊以將該文件上傳到CDN。在處理Flask請求的服務器上運行Celery任務
Celery任務可以由集羣中的任何節點處理。如果Celery任務由不同於處理Flask路由的節點處理,則不會找到該文件,並且任務將失敗。
如何確保Celery任務在處理Flask路由的同一節點上運行?
我有一個運行我的Flask應用程序和Celery工作者的多個服務器的設置。 Flask路由在本地處理文件上載,並將Celery任務排隊以將該文件上傳到CDN。在處理Flask請求的服務器上運行Celery任務
Celery任務可以由集羣中的任何節點處理。如果Celery任務由不同於處理Flask路由的節點處理,則不會找到該文件,並且任務將失敗。
如何確保Celery任務在處理Flask路由的同一節點上運行?
如果您希望處理上載的服務器處理後臺作業,則根本不需要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')
如果你想堅持芹菜,你可以forgoe文件保存在本地,並通過文件數據作爲參數傳遞給了任務,所以無論什麼服務器處理上載,即處理的一個任務總會有數據。如果文件很大,可能會有性能問題。
@celery.task
def upload(data):
...
upload.delay(file.read())
沒有專用的上傳框。任何應用程序服務器實例都可以是向客戶端公開POST API的上傳框。 – lang2
@ lang2我已經更新了我的答案,現在我明白你的意思了。 – davidism
@davidsm w.r.t第二種方法:文件上傳將在一個HTML格式的文件中提交,我不認爲它可以被另一個節點訪問。 – lang2