1

保存進度到會話所以即時通訊想知道如何做到這一點。 我嘗試在request.session對象內保存長時間運行任務的進度。而不是能夠得到進程的狀態與使用泳池類,使我長時間運行的異步進度另一種觀點方法Django以下標

林:

MyCalculation.py 
def longrunning(x,request): 
    request.session['status'] = 5; 
    return x*x 

views.py 
def dolongrunning(request, x): 
    pool = Pool(processes=1) 
    result = pool.apply_async(MyCalculation.longrunning, [x, request]) 
    return JsonResponse(..) 

def status(request): 
    return JsonResponse(request.session.get('status)) 

所以這行不通。我的異步作業執行但請求對象沒有得到我的進度信息。

我怎麼能做到或有另一種方式? 我有感覺通過請求對象一般來說是個壞主意。 在Django/Python中存儲長時間運行狀態的最佳做法是什麼?

+0

請說清楚你的問題。什麼不行?你想做什麼? – noxdafox

+0

好了更新了我的問題。 request.session對象的更新不起作用,並試圖以某種方式存儲我長時間運行的操作的進度 – Michele

回答

1

不同的進程不共享相同的內存空間,但他們爲每個進程獲取副本。

就你的情況而言,工作進程在longrunning函數中收到的request對象是在父進程中創建的對象的副本。其中一個進程所做的更改不會影響其他進程。

你想要做的是將更新從工作進程發送到父進程,然後在父進程中更新請求狀態。

from multiprocessing import Pool, Queue 


def worker(task, message_queue): # longrunning 
    # do something 
    message_queue.put(5) 
    # do something else 
    message_queue.put(42) 


def request_handler(request, task, message_queue): # dolongrunning 
    result = pool.apply_async(worker, [task, message_queue]) 
    return JsonResponse(..) 


def status(request): 
    status = message_queue.get() # this is blocking if no messages in queue 
    request.session['status'] = status; 
    return JsonResponse(request.session['status']) 


pool = Pool(processes=1) 
message_queue = Queue() 

這是非常簡化,它實際上阻止狀態請求如果沒有設置狀態,但它提供了一個想法。

更好的方法是將請求存儲在緩衝區中,並使消息隊列保留爲空。每次收到狀態請求時,都會返回從工作人員收到的最新狀態更新。