2014-02-13 100 views
5

我試圖能夠同時響應傳入的Web請求,而處理請求包含相當長的IO調用。我打算使用gevent,因爲它應該是「非阻塞的」非阻塞併發wsgi服務器

我發現的問題是請求按順序處理,即使我有很多gevent線程。由於某些原因,請求會由單個綠色線程提供服務。

我有nginx(默認配置這是不相關的,我認爲),我也有uwsgi和簡單的wsgi應用程序模擬IO阻塞調用爲gevent.sleep()。在這裏,他們是:

uwsgi.ini

[uwsgi] 
chdir = /srv/website 
home = /srv/website/env 
module = wsgi:app 
socket = /tmp/uwsgi_mead.sock 
#daemonize = /data/work/zx900/mob-effect.mead/logs/uwsgi.log 
processes = 1 
gevent = 100 
gevent-monkey-patch 

wsgi.py

import gevent 
import time 
from flask import Flask 

app = Flask(__name__) 

@app.route("/") 
def hello(): 
    t0 = time.time() 
    gevent.sleep(10.0) 
    t1 = time.time() 
    return "{1} - {0} = {2}".format(t0, t1, t1 - t0) 

然後我同時(幾乎)開放兩個選項卡在我的瀏覽器,這裏是我得到結果:

1392297388.98 - 1392297378.98 = 10.0021491051 
# first tab, processing finished at 1392297378.98 

1392297398.99 - 1392297388.99 = 10.0081849098 
# second tab, processing started at 1392297398.99 

如您所見,首先調用阻止視圖的執行。我錯了什麼?

+0

也許增加'processes = 1'? –

+1

如果我想爲2-10個請求提供服務,那麼只需運行多個進程或線程並在一天內調用它即可。我甚至不需要爲此做點事情。但我會服務數千個同時緩慢的請求,我顯然需要一個事件循環,我肯定會做錯事... – Arseniy

+0

我認爲gunicorn的gevent(或eventlet)工人會做你想做的事情,儘管我避風港我沒有這樣用過。 – dcrosta

回答

3

以curl或瀏覽器以外的任何其他地方發送請求,因爲瀏覽器對每個站點或每個地址的同時連接數有限制。或者使用兩種不同的瀏覽器。