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
如您所見,首先調用阻止視圖的執行。我錯了什麼?
也許增加'processes = 1'? –
如果我想爲2-10個請求提供服務,那麼只需運行多個進程或線程並在一天內調用它即可。我甚至不需要爲此做點事情。但我會服務數千個同時緩慢的請求,我顯然需要一個事件循環,我肯定會做錯事... – Arseniy
我認爲gunicorn的gevent(或eventlet)工人會做你想做的事情,儘管我避風港我沒有這樣用過。 – dcrosta