2013-02-13 69 views
5

我正在嘗試使用gunicorn及其異步工作者的長時間運行請求,但是我找不到任何可以工作的示例。我使用的例子here但扭捏返回響應之前增加一個假的延遲(睡眠5秒):gunicorn不同時處理同時發生的請求

def app(environ, start_response): 
    data = "Hello, World!\n" 
    start_response("200 OK", [ 
     ("Content-Type", "text/plain"), 
     ("Content-Length", str(len(data))) 
    ]) 
    time.sleep(5) 
    return iter([data]) 

然後我跑gunicorn這樣:

gunicorn -w 4 myapp:app -k gevent

當我打開兩個瀏覽器並在其中輸入http://127.0.0.1:8000/,並幾乎同時發送請求,這些請求似乎按順序處理 - 一個在5秒後返回,另一個在後返回 5秒。

問:我猜睡眠不是友好的嗎?但是有4名工人,所以即使工人的類型是「同步」,兩名工人也應該同時處理兩個請求。

+0

您是否找到解決方案? – 2013-09-24 10:47:58

+0

對不起,我沒有。 – swoop81 2013-09-24 15:53:22

回答

5

我剛碰到同樣的東西,在這裏打開一個問題:Requests not being distributed across gunicorn workers。結果是,瀏覽器似乎序列化訪問同一頁面。我猜測這可能與緩存能力有關,也就是說瀏覽器認爲它可能是可緩存的頁面,等到它加載時發現它並不是如此,這會產生另一個請求等等。

+0

這麼煩人,那麼簡單... :( – jwg 2017-09-08 18:15:23

+0

Thanks @CrazyCasta。我已經通過安裝另一個瀏覽器並同時發送來自兩個獨立瀏覽器(鉻和firefox)的請求來驗證您的答案,並且請求確實得到並行服務 – swoop81 2017-11-07 22:33:25

0

gevent.sleep一擊而不是time.sleep

這很奇怪,-w 4發生這種情況,但-k gevent是異步工作者類型,所以有可能gunicorn將這兩個請求提供給同一個客戶端。假設發生了什麼,time.sleep將鎖定您的進程,除非您使用gevent.monkey.patch_all()

1

當使用非阻塞工人類型的gunicorn(如gevent)時,它將只使用一個處理請求的進程,因此順序執行5秒鐘的工作並不令人驚訝。

當你的工作負載很輕並且請求速度很快時,異步工作器很有用,在這種情況下,gunicorn可以利用等待IO時浪費的時間(例如,等待套接字可寫入來寫入響應) , 通過切換到另一個工作人員來處理另一個請求。 通過切換到另一個分配給同一個工作人員的請求。

UPDATE

我錯了。

當使用非阻塞工人類型的gunicorn,在gunicorn中的工作人員設置時,每個工人都是一個進程,它運行一個單獨的隊列。

因此,如果time.sleep在不同的進程上運行,它將同時運行,但是當它運行在同一個worker中時,它將按順序執行。

問題是gunicorn loadbalancer可能沒有將這兩個請求分配到兩個工作進程中。您可以通過os.getpid()檢查當前進程。

+0

Gunicorn不使用一個進程來處理請求;它使用您指定的編號作爲'-w'標誌。 – 2015-11-07 22:51:44

+0

@ ron.rothman這是真的!我的解釋是錯誤的,謝謝提及。 – tdihp 2015-11-09 01:28:35

相關問題