2015-08-28 196 views
2

我有一個運行我的Flask應用程序和Celery工作者的多個服務器的設置。 Flask路由在本地處理文件上載,並將Celery任務排隊以將該文件上傳到CDN。在處理Flask請求的服務器上運行Celery任務

Celery任務可以由集羣中的任何節點處理。如果Celery任務由不同於處理Flask路由的節點處理,則不會找到該文件,並且任務將失敗。

如何確保Celery任務在處理Flask路由的同一節點上運行?

回答

2

如果您希望處理上載的服務器處理後臺作業,則根本不需要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()) 
+0

沒有專用的上傳框。任何應用程序服務器實例都可以是向客戶端公開POST API的上傳框。 – lang2

+0

@ lang2我已經更新了我的答案,現在我明白你的意思了。 – davidism

+0

@davidsm w.r.t第二種方法:文件上傳將在一個HTML格式的文件中提交,我不認爲它可以被另一個節點訪問。 – lang2

相關問題