2011-05-07 15 views
3

在playframework的文檔here已被寫入:await()如何工作?

public static void loopWithoutBlocking() { 
    for(int i=0; i<=10; i++) { 
     Logger.info(i); 
     await("1s"); 
    } 
    renderText("Loop finished"); 
} 

我真的不明白它究竟是如何工作的:

例如,當我們呼籲在第一次請求I = 1的方法,然後..解鎖和等待..和新的請求去該方法,然後再次從i = 0開始?當第一次請求喚醒時,它會有i = 1或0或2?

它在這裏沒有使用任何有狀態的機制?像存儲我..之間的請求例如?

回答

6

Play 1.1中的這種工作方式是使用suspend函數,該函數在Play 1.2中用await()替換。在1.1中,掛起功能並沒有在同一時刻啓動進程,而是簡單地回顧了該方法,在進程已經「暫停」了指定的時間之後使用相同的輸入。

原因是爲了確保正在「睡眠」的線程不會阻止其他請求被處理(在Dev模式下嘗試,只有一個線程正在運行,並等待10秒,您仍然可以發送第二個請求,並進行處理)。所以,在Play1.1中,你必須保持狀態。

Play 1.2和使用await的區別在於重新啓動該方法是在幕後進行的,並且它在它停止的位置重新啓動該方法,因此變量的狀態也應該保​​留。

在你的示例中(取自文檔),它應該簡單地從零循環到9,並且在每個點處等待1秒鐘。如果您沒有遇到這種情況,那麼我認爲這是一個錯誤。

+1

thx的完整解釋。但是,只是爲了檢查:是否應該繼續前一點。如果在等待i = 1之後,我們從等待中返回後,對於特定的一個請求,我仍然是= 1?即當它進入等待狀態並且從該保存的點繼續時,它以某種方式獲得方法狀態的快照? – ses 2011-05-08 09:36:42

+1

是的。延續的想法是,它從它離開的地方繼續(所以我將是1)。所以從程序員的角度來看,就像在執行中暫停一樣。 Play會處理線程如何發佈並在稍後繼續的複雜性。 – Codemwnci 2011-05-08 09:39:58