0

我在GAE-Python上的網站有一個函數來使用演化優化算法計算一些數學運算,當用戶點擊一個按鈕時,這個算法將被ajax請求調用。每個請求通常需要很長時間才能完成計算。如何中斷當前請求,Google App Engine?

我需要一些方法(ajax或其他方法)告訴服務器取消當前請求,而不是使用ajax的xhr.abort()函數,該函數不會停止服務器端的計算。

對於早期嘗試,我發現GAE具有請求計時器,如果請求花費太長時間完成,則運行時會提出DeadlineExceededError

基於這個想法,我想問一下,是否有辦法向服務器發送一個信號,使運行時觸發請求中斷?

+0

沒有。您將在60秒後擊中DeadLineExceededError,或者您要求在您的控制下終止(返回)。 –

+1

如果您認爲請求需要超過60秒,並且您希望獲得更多控制權限,我建議您使用一項任務(可以運行10分鐘),並且可以監視memcache狀態。您的前端請求還可以定期檢查memcache狀態。這還需要線程或異步任務和期貨 –

+1

您需要一個單獨的處理程序(可能還有一個令牌,以便請求可以識別要監視的memcache密鑰),它接收取消請求並在memcache中設置鍵/值。 –

回答

0

您不應該試圖在處理程序中同步執行任何長時間運行的任務。這是task queue的完美人選。 Ajax請求應該簡單地將任務推送到隊列中,App Engine將會離線處理它。任務會有十分鐘的超時時間。

您可以使用memcache或數據存儲將信息傳入和傳出Ajax代碼。例如,任務處理程序可以每隔幾秒就檢查一次memcache是​​否存在「stop_processing_FOO」鍵(其中FOO是任務第一次觸發時由Ajax生成的唯一ID),並且您的「取消」按鈕會調用處理程序將該密鑰插入到memcache中。

同樣,任務可以在完成時將具有相關值的'finished_processing_FOO'鍵放入memcache中,並且您的Ajax可以定期輪詢檢查該鍵是否存在的處理程序,如果是,則返回值。

相關問題