python
  • asynchronous
  • heroku
  • flask
  • 2017-05-03 65 views 0 likes 
    0

    我有一個特別大的任務需要60秒才能完成。 Heroku的路由器在30秒後發出一個超時錯誤,如果不返回任何,所以使用yield陳述有助於解決:使用yield來異步Flask響應,但在長異步調用結束時添加標題信息?

    def foo(): 
        while not isDone: 
         print("yield") 
         yield " " 
         time.sleep(10) 
    return Response(foo(), mimetype='text/html')``` 
    

    (或類似的東西)

    這工作都很好,除了在我的在我的很長時間任務結束時,它會決定接下來前進到哪裏。這是很容易設置轉發的位置:在這個例子中/bar是靜態

    response = Response(foo(), 302, mimetype='text/html') 
    response.headers['Location'] = '/bar' 
    return response 
    

    除了這一點,我需要分配一個動態的,只有在很長的過程的結束。

    那麼有沒有辦法在非常長的異步過程結束時動態分配轉發位置?

    +0

    使用芹菜做耗時的任務並使用ajax來查詢結果。 – stamaimer

    +0

    @stamaimer雖然芹菜/兔子是一個不錯的選擇,但我在允許使用的東西方面受到限制(一切都需要來自客戶的批准等級,並且等待2-3周才能獲得簡單的2號錯誤不這樣做)。如果Flask不能單獨完成,那就這樣吧,但我需要檢查。 –

    回答

    0

    確保我正確解釋了這一點。你有一個請求產生一些東西併發出重定向。世代需要很長時間,觸發Heroku超時。不管怎樣,你想避開時間。

    您是否可以單獨使用Flask來完成此任務,並使用Heroku路由層的約束?有點。但請注意,您正在執行的簡單「保持活動」會失敗,因爲它會導致無效的HTTP響應。一旦你開始發送任何不是而不是的標題,就不能發送標題(即重定向)。

    你兩個選擇 -

    • 投票。啓動一個異步作業,預先計算作業結果的URL,但通過某種「監視器」保護它(例如,檢查作業並顯示「進行中」,每2-5秒鐘刷新一次,直到完成)。你有一個用於計算結果的工人測功機。通常,我會說「Redis + Python RQ」可以快速啓動,但如果您無法添加任何新的服務器端依賴項,那麼簡單的數據庫隊列表就足夠了。
    • 推。使用附加組件,如Pusher。沒有新的服務器端依賴關係,只有一個帳戶(具有低成本的入口選項)如果這不是一個選項,請滾動WebSocket的解決方案。

    一般來說,花一些時間做一個好的異步回報將長期得到回報。這是對任何網站提供的單一最佳性能增強之一 - 快速返回,爲用戶提供響應式體驗。您必須在另一個進程或線程中產生異步任務,以釋放其他響應的請求線程。

    相關問題