2012-07-06 121 views
4

這是一個測試應用程序:如何將一個URL的請求分配給多個線程?

#!/usr/bin/env python 

from flask import Flask 
from time import sleep 

application = Flask(__name__) 
application.debug = True 

@application.route('/a') 
@application.route('/b') 
@application.route('/c') 
def a(): 
    sleep(10) 
    return 'Hello world.' 

if __name__ == '__main__': 
    application.run() 

該應用程序部署在Apache:

WSGIDaemonProcess Test processes=2 threads=15 display-name=%{GROUP} 
WSGIProcessGroup Test 

如果你

  • 請求/年00:00
  • 請求/ B at 00:01
  • request/c at 00:02

,你將

  • 從/在一個00:10
  • 接收響應接收來自/ B在0時11
  • 響應接收來自/ C在零時12
  • 響應

但是,如果你

  • REQ uest/A在00:00
  • 請求/一個在00:01
  • 請求/一個在00:02

,你將

  • 從/在00接收響應: 10
  • 在00:20
  • 接收響應從/在00:30
接收來自/響應

所以我想每一個URL的請求都在一個線程中處理。現在我打算開發一個長久的服務器,我想我需要將每個請求分派給一個獨立的線程,以避免阻止後續的請求。我該怎麼辦?

+0

如果您嘗試處理長輪詢,您可能需要使用Tornado之類的異步框架來避免創建過多的線程。 – Amber 2012-07-06 16:27:00

+1

你可以嘗試返回[一個生成器](http://flask.pocoo.org/docs/patterns/streaming/):'def a():\ n def g():sleep(10); yield'hello'\ n return Response(g(),mimetype ='text/plain')'。它可能行不通,但值得一試。 – jfs 2012-07-06 16:33:49

回答

3

此問題已解決。我的猜測是錯誤的,事實是:
在Chrome瀏覽器中,如果兩個請求由相同的協議,主機名,端口和路徑組成,那麼稍後的請求將不會發送,直到前一個請求關閉。
被封鎖的東西不是服務器,而是瀏覽器。

相關問題