Python3.5发布,Tornado也随后更新,支持最新的async/await语法,正好试验一下异步特性,写了一个简单的例程。
server.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import logging
import os
import sys
import tornado
import tornado.gen
import tornado.ioloop
import tornado.web
class SleepHandler(tornado.web.RequestHandler):
async def get(self, *args, **kwargs):
await tornado.gen.sleep(3)
self.write(‘test‘)
if __name__ == ‘__main__‘:
logging.basicConfig(
format=‘%(levelname)s %(module)s.%(funcName)s[%(lineno)d] %(message)s‘,
level=logging.DEBUG)
# 设置程序工作目录
os.chdir(os.path.dirname(os.path.realpath(sys.argv[0])))
# URL映射
handlers = [
# 静态文件和模板
(‘/‘, tornado.web.RedirectHandler, {‘url‘: ‘/web/index.html‘}),
(‘/web/(.*)‘, tornado.web.StaticFileHandler, {‘path‘: ‘web‘}),
# REST
(‘/rest/sleep‘, SleepHandler),
]
settings = {
‘debug‘: True
}
application = tornado.web.Application(handlers, **settings)
application.listen(8080)
tornado.ioloop.IOLoop.instance().start()
web/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="jquery.js"></script>
<script>
$(function () {
for (var i = 0; i < 100; i++) {
$.ajax(‘/rest/sleep‘);
}
});
</script>
</head>
<body>
</body>
</html>
使用Firefox和Chrome浏览网页,启用开发者工具查看请求响应情况,结果很有趣。
Firefox无论第一次打开还是刷新都是这样子的:
而Chrome刷新后是这样子的:
可以看到,无论是Firefox还是Chrome,最多貌似只能有6个并发连接,为了验证问题是否出在服务器,我甚至使用了Wireshark看数据包时间,结果确认是在浏览器。
Chrome刷新页面之后会出现很多304,而且这些调用没有并发执行,查资料得知某些浏览器会在连续请求同一个URL的情况下挂起后续请求,至于为什么有些是304有些是200,查看调用细节,304的请求中包含了“If-None-Match”,而200请求中却没有,至于浏览器为什么这样做就不知道了。
解决办法是每一次请求的URL后面加上一个变化的参数,让浏览器误以为是不同的请求,也就是在index.html的for循环内语句改成
$.ajax(‘/rest/sleep?‘ + i);
这样,Chrome就正常了:
那么能不能提高浏览器的并发连接数呢?再次查资料得知,Chrome是硬编码在程序中的,无法修改,而Firefox可以修改“network.http.max-persistent-connections-per-server”配置项,比如我改成100,再次刷新页面,终于看到了100个并发连接:
原文:http://my.oschina.net/mallon/blog/530201