2017-10-13 105 views
0

將相對長時間運行的任務委託給另一臺服務器上的芹菜工作人員,這些工作人員正在單獨運行。在Flask中成功提交後執行celery任務?

但是,結果被添加回關係數據庫(根據task_descr.id作爲關鍵字更新表,見下文),工作人員使用ignore_result

任務從瓶的應用要求:

task = app.celery.send_task('tasks.mytask', [task_descr.id, attachments]) 

的問題是,被請求的任務,而交易尚未燒瓶上側封閉。這會導致競爭狀態,因爲有時候芹菜工作者會在Flask應用程序的事務結束之前完成任務。

成功事務後發送任務的正確方法是什麼?

還是應該在工作人員檢查task_descr.id可用性,然後嘗試條件UPDATE並重試該任務(這種感覺過於複雜)?

Run function after a certain type of model is committed的回覆討論了類似的情況,但這裏任務發送是明確的,所以不需要在某些模型中偵聽更新/插入。

回答

0

的方法之一,是Per-Request After-Request Callbacks,由於阿明Ronacher:

from flask import g 

def after_this_request(func): 
    if not hasattr(g, 'call_after_request'): 
     g.call_after_request = [] 
    g.call_after_request.append(func) 
    return func 


@app.after_request 
def per_request_callbacks(response): 
    for func in getattr(g, 'call_after_request',()): 
     response = func(response) 
    return response 

在我的情況的用法是:

@after_this_request 
    def send_mytask(response): 
     if response.status_code in {200, 302}: 
      task = app.celery.send_task('tasks.mytask', [task_descr.id, attachments]) 
     return response 

不理想,但似乎工作。我的任務僅限於成功提供服務的請求,所以我不在乎500或其他錯誤條件。

相關問題