簡體   English   中英

使用 Gunicorn 和 Gevent 運行 Flask 時如何使用請求發出非阻塞請求

[英]how to make a non-blocking request with requests when running Flask with Gunicorn and Gevent

我的 Flask 應用程序會收到一個請求,做一些處理,處理需要很長時間。 使用 Gevent 運行 Gunicorn 將允許它同時處理許多這些緩慢的請求。 我知道當我的應用程序處理這個請求時,它也可以處理其他請求,但我的目的是在這個請求中它可以快速響應客戶端並且仍然在后台處理圖像下載。我如何修改下面的例子,使視圖是非-阻塞?

@app.route('/do', methods = ['POST'])
def do():
    # here download many picture, it will tasks long time, and block。
    return 'ok'

Flask + gevent 不是正確的工具。 Gevent 使用猴子補丁在事件循環上運行常規代碼 - 但在此過程中,您無法運行常規事件循環內容(例如調度異步任務)。 我不是 gevent 專家(所以也許有一種我不知道的技術),但我不這么認為。

為了實現這一點,我會做兩件事之一。

  1. 設置異步任務系統。 我用了一噸芹菜,但還有其他的選擇。 這樣做的缺點是你通常需要另一塊基礎設施——Redis、rabbitmq 之類的東西。 不過,這確實是最好的解決方案。

  2. 使用顯式異步 Web 框架。 我為此使用 Sanic。 它讓您可以直接從視圖中調度協程,以便即使在視圖協程完成后它們也可以繼續運行。 這意味着您的所有代碼都必須是異步的,這是一個學習曲線。

使用線程或多處理來開始您的工作並且沒有任何監控它來進行清理是一個不太好的解決方案。 最后,uwsgi 為后台任務內置了一些東西,盡管我還沒有嘗試過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM