2013-04-23 196 views
1

Django有類似於ASP.NET MVC的Asynchronous Controller嗎?Django異步請求

我有一些請求將由芹菜工作人員處理,但不會花費很長時間(幾秒鐘)。我希望客戶在工作完成後得到迴應。我可以讓我的視圖函數等待任務完成,但我擔心它會給Web服務器帶來太多的負擔。

澄清:

這裏的流量我能有今天

def my_view(request): 
    async = my_task.delay(params) 
    result = async.get() 
    return my_response(result) 

async.get()可能需要幾秒鐘 - 不要太長,這樣客戶端不能等待HTTP響應找回。

此代碼可能會給服務器帶來不必要的壓力。什麼ASP.NET MVC的AsynchronousController提供,就是要打破這個函數有兩種能力,與此類似:

def my_view(request): 
    async = my_task.delay(params) 
    return DelayedResponse(async, lambda result=>my_response(result)) 

這釋放了Web服務器,直到異步操作完成,以處理其他請求。一旦完成,它將在結果上執行lambda表達式,並返回響應。

回答

1

是的,只有當任務完成時,您纔可以執行某些操作。你會想看看chain()。您可以在綁定鏈芹菜任務:

chain = first_function.s(set) | second_Function.s(do) 

    chain() 

這兩個功能first_function and second_function都將是芹菜功能。 second_function僅在first_function完成其執行時執行。

+0

欲瞭解更多信息:http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=chain#celery.chain – pynovice 2013-04-23 08:34:20

+0

我不想連鎖任務。我會澄清。 – zmbq 2013-04-23 08:36:21

2
  1. 而不是等待請求完成,您可以返回狀態「進行中」的再發送一個多個請求,以檢查是否狀態已經改變。由於您正在進行純粹的查找,因此響應速度非常快,不會給Web服務器帶來太多負擔。

  2. 您可以將此特定視圖/功能外包給專爲異步回調設計的Tornado Web服務器。該網站的其餘部分可能會繼續在django上運行。

  3. 最有可能的解決方案應該不是技術性的,但在UI/UX領域。如果事情需要很長時間,如果通知明確,通知用戶就可以了。

+0

至於1和3 - 我不想讓客戶發送另一個請求。它仍然足以被最終用戶接受。 – zmbq 2013-04-23 09:05:08

+0

@zmbq您在網上沒有很多選項。你可以做'輪詢','長輪詢'或'websockets'。如果你100%確定它可以在一個請求/響應週期內完成,你不應該使用芹菜。如果您確實使用了它,請選擇我提到的3種方法中的任何一種。 ASP.NET的異步控制器,我懷疑,它只是隱藏了上述細節。 – rantanplan 2013-04-23 16:18:54

+0

ASP.NET的異步控制器所做的是在異步操作發生時在web服務器上釋放一個線程。 Web服務器的線程可以自由處理另一個請求。異步任務完成後,Web服務器將其分配給其中一個正在運行的線程並繼續處理。它與* client *輪詢無關,使用websockets或其他。 – zmbq 2013-04-23 19:52:38