第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

報告長期運行的Celery任務(wù)的結(jié)果

報告長期運行的Celery任務(wù)的結(jié)果

紫衣仙女 2019-11-02 13:31:10
問題我已經(jīng)將一個長期運行的任務(wù)劃分為多個邏輯子任務(wù),因此我可以在每個子任務(wù)完成時報告結(jié)果。但是,我正在嘗試報告將永遠無法完成的任務(wù)的結(jié)果(而不是不斷產(chǎn)生價值),并且正在使用現(xiàn)有的解決方案來做到這一點。背景我正在為我編寫的某些Python程序構(gòu)建Web界面。用戶可以通過Web表單提交作業(yè),然后返回查看該作業(yè)的進度。假設(shè)我有兩個函數(shù),每個函數(shù)可以通過單獨的形式進行訪問:med_func:執(zhí)行大約需要1分鐘,結(jié)果傳遞給render(),這會產(chǎn)生其他數(shù)據(jù)。long_func:返回一個生成器。每次yield大約需要30分鐘,應(yīng)向用戶報告。產(chǎn)量很多,我們可以認為此迭代器是無限的(僅在被撤銷時終止)。代碼,當(dāng)前實現(xiàn)使用med_func,我報告結(jié)果如下:在表單提交時,我將保存AsyncResult到Django會話:    task_result = med_func.apply_async([form], link=render.s())    request.session["task_result"] = task_result結(jié)果頁面的Django視圖訪問this AsyncResult。任務(wù)完成后,結(jié)果將保存到作為上下文傳遞給Django模板的對象中。def results(request):    """ Serve (possibly incomplete) results of a session's latest run. """    session = request.session    try:  # Load most recent task        task_result = session["task_result"]    except KeyError:  # Already cleared, or doesn't exist        if "results" not in session:            session["status"] = "No job submitted"    else:  # Extract data from Asynchronous Tasks        session["status"] = task_result.status        if task_result.ready():            session["results"] = task_result.get()            render_task = task_result.children[0]            # Decorate with rendering results            session["render_status"] = render_task.status            if render_task.ready():                session["results"].render_output = render_task.get()                del(request.session["task_result"])  # Don't need any more    return render_to_response('results.html', request.session)僅當(dāng)函數(shù)實際終止時,此解決方案才有效。我無法將的邏輯子任務(wù)鏈接在一起long_func,因為存在未知數(shù)量的yields(每個循環(huán)long_func的循環(huán)可能不會產(chǎn)生結(jié)果)。題有什么明智的方法可以從極其長時間運行的Celery任務(wù)訪問生成的對象,以便可以在生成器用盡之前對其進行顯示?
查看完整描述

3 回答

?
臨摹微笑

TA貢獻1982條經(jīng)驗 獲得超2個贊

芹菜部分:


def long_func(*args, **kwargs):

    i = 0

    while True:

        yield i

        do_something_here(*args, **kwargs)

        i += 1



@task()

def test_yield_task(task_id=None, **kwargs):

    the_progress = 0        

    for the_progress in long_func(**kwargs):

        cache.set('celery-task-%s' % task_id, the_progress)

Web客戶端,開始任務(wù):


r = test_yield_task.apply_async()

request.session['task_id'] = r.task_id

測試最后的屈服值:


   v = cache.get('celery-task-%s' % session.get('task_id'))

   if v:

        do_someting()

如果您不喜歡使用緩存或無法使用緩存,則可以使用db,文件或celery worker和服務(wù)器端都可以同時訪問的任何其他位置。使用緩存是最簡單的解決方案,但是工作人員和服務(wù)器必須使用相同的緩存。


查看完整回答
反對 回復(fù) 2019-11-02
  • 3 回答
  • 0 關(guān)注
  • 1467 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號