为什么同步处理具有相同URL的请求?

时间:2016-10-03 22:52:28

标签: python asynchronous flask request cherrypy

我认为这是我正在使用的框架的一个怪癖,所以我测试了另一个框架,但结果是一样的:发送一连串请求将按照预期异步处理它们,当网址不同时,会排队具有相同URL的请求并同步处理它们。

为什么有些请求是同步处理的,有些是异步处理的?

使用Flask和CherryPy测试代码。使用Flask访问localhost:5000,使用CherryPy访问localhost:8080将使用JavaScript加载一个页面,该页面将发送16个请求。请求在查询字符串中有一个未使用的参数,该参数可以有4个不同的值,因此服务器将接收4个不同的请求,每个请求4次,总共16个请求。

服务器开始处理每个参数值的前4个请求,完成后将开始处理接下来的4个请求等。

为什么不同时处理所有16个请求?

烧瓶

import flask
import time
import threading
import datetime

app = flask.Flask(__name__)

def log(txt):
    print('  {} {:6d} {}'.format(datetime.datetime.now().strftime('%H:%M:%S.%f'), 
                              threading.current_thread().ident,
                              txt))

@app.route('/')
def index():
    log('index')
    return """<!DOCTYPE HTML>
<html>
<head>
<script>
setTimeout(function(){{
  for(i=0; i<16; i++) {{
    xhttp = new XMLHttpRequest();
    xhttp.open("GET", "test/" + i%4, true);
    xhttp.send();
  }}
}}, 2000);
</script>
</head>
<body>
hello
</body>
</html>"""

@app.route('/test/<x>')
def test(x):
    log('test{}'.format(x))
    time.sleep(3)
    log('   test{}'.format(x))
    return 'OK'

app.run(threaded=True)

的CherryPy

import cherrypy
import time
import datetime
import threading

def log(txt):
    print('  {} {:6d} {}'.format(datetime.datetime.now().strftime('%H:%M:%S.%f'), 
                              threading.current_thread().ident,
                              txt))

class Root:

    @cherrypy.expose
    def index(self):
        log('index')
        return """<!DOCTYPE HTML>
<html>
<head>
<script>
setTimeout(function(){{
  for(i=0; i<16; i++) {{
    xhttp = new XMLHttpRequest();
    xhttp.open("GET", "test?x=" + i%4, true);
    xhttp.send();
  }}
}}, 2000);
</script>
</head>
<body>
hello
</body>
</html>"""

    @cherrypy.expose
    def test(self, x):
        log('test{}'.format(x))
        time.sleep(3)
        log('   test{}'.format(x))
        return 'OK'

if __name__ == '__main__':
    cherrypy.quickstart(Root())

0 个答案:

没有答案