2011-08-17 73 views
3

我剛開始使用協程,並閱讀了gevent和greenlets。爲了測試我通過gevents pywsgi模塊爲這個代碼:使用Gevent和WSGI阻止呼叫

from gevent.pywsgi import WSGIServer 
import gevent 

def hello_world(env, start_response): 
    gevent.sleep(5) 
    start_response('200 OK', [('Content-Type', 'text/html')]) 
    return ["<b>hello world</b>"] 

print 'Serving on 8088...' 
WSGIServer(('127.0.0.1', 8888), hello_world).serve_forever() 

我期望的結果,其中顯示文本之前每個請求將獲得5秒的延遲。但是,會發生什麼情況是每次請求都會通過調用gevent.sleep()來排隊,如果第一次請求在第一次請求之後立即啓動,則第二次請求將花費近10秒的時間。

是不是serve_forever函數爲每個請求產生新的greenlet?

回答

6

你用什麼來提出請求?我懷疑問題在那裏。

我測試了AB(阿帕奇基準)代碼,並得到這個(編輯輸出):

$ ab -c 200 -n 200 http://localhost:8888/ 

Completed 100 requests 
Completed 200 requests 
Finished 200 requests 

Concurrency Level:  200 
Time taken for tests: 5.048 seconds 
Requests per second: 39.62 [#/sec] (mean) 
Time per request:  5048.386 [ms] (mean) 

AB的命令,使200個併發請求到服務器GEVENT。五秒鐘後,所有請求都已完成。如果請求排隊,如您所建議的那樣,這個基準測試需要1000秒。

我想你的系統可能不會正確地支持greenlet,但看起來你用來測試的方法在每個請求上被阻塞的可能性更大。即服務器支持併發,但您的客戶端不支持。

0

已知瀏覽器將請求排入同一個域。

嘗試爲不同的連接打開不同的瀏覽器(不是不同的瀏覽器窗口,實際上是不同的應用程序,例如FF和Chrome)。