2010-04-30 73 views
10

我一直在玩最近的其他框架,比如NodeJS。執行非阻塞請求? - Django

我喜歡回覆回覆的可能性,並且仍然能夠進行進一步的操作。

例如

def view(request): 
    do_something() 
    return HttpResponse() 

    do_more_stuff() #not possible!!! 

也許Django的已經提供返回的請求後執行操作的方式,如果是這樣,這將是巨大的情況下。


幫助將非常感謝! = D

回答

10

由於您已退出該方法,因此不能開箱即用。你可以使用類似Celery的東西,它會將do_more_stuff任務傳遞到隊列中,然後在http請求/響應流之外運行do_more_stuff()

7

Django的讓您與信號做到這一點,更多的信息可以發現here。 (請注意,我在下面的評論說,信號不無阻塞,但他們讓你返回在視圖中的響應後執行代碼。)

如果你正在尋找到做很多很多異步請求並且需要它們是非阻塞的,那麼您可能需要檢查Tornado

+0

此外,這種方法不會在技術上是不可阻擋的Django是不是在大多數部署無阻塞架構,但它會讓你做一些返回響應後。龍捲風會讓你執行無阻塞的請求。 – Zack 2010-04-30 09:04:59

+0

@Zack:謝謝你,我沒有意識到信號會幫助我。 – RadiantHex 2010-04-30 09:18:47

+0

不要忘記標記爲答案:) – Zack 2010-04-30 09:27:55

2

因爲你從函數返回,所以do_more_stuff永遠不會被調用。

如果您正在尋找在做繁重的東西排隊東西,你回來之前羅斯建議(+1芹菜)。

然而,如果你正在尋找將一些內容......然後做一些事情,並給用戶返回流更多的內容可能是你在找什麼。您可以將一個迭代器或一個生成器傳遞給HttpResponse,它將以涓流的方式迭代並推出內容。這感覺有點壞,但如果你是一個發電機的搖滾星,你可以在各種狀態下做足夠的事情來完成你想要的。

或者我想你可以簡單地重新設計你的頁面中使用了大量的AJAX做你需要什麼,包括髮射了事件Django的觀點,閱讀從視圖中的數據,等等

它種歸結爲異步的負擔將放在哪裏:客戶端,服務器或響應。

我沒那麼熟悉Node.js的呢,不過看到你在談論的使用情況下,它會很有趣。

編輯:我做了一些更尋找到信號,雖然他們確實發生在過程中,有一個內置的信號request_finished後的請求已被Django的處理,但它更是一個包羅萬象的不是東西具體。

1

您可以將線程作爲臨時修補程序或作爲非生產解決方案使用,但它既不是可擴展的,也不是最佳實踐。使用芹菜更好的設計!

def foo(request): 
    import threading 
    from time import sleep 
    def foo(): 
     sleep(5) 
     # Do something 
     print('hello, world') 
    threading.Thread(target=foo).start() 
    return JsonResponse(data={'detail': 'thread started'})