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