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