2012-07-06 120 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浏览器中,如果两个请求由相同的协议,主机名,端口和路径组成,那么稍后的请求将不会发送,直到前一个请求关闭。
被封锁的东西不是服务器,而是浏览器。

相关问题