此博客都会不定期迭代更新
以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对应的线程来用web应用(如Django)进行处理。
考虑两类应用场景
用户量大,高并发 如秒杀抢购、双十一某宝购物、春节抢火车票
大量的HTTP持久连接 使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。 对于HTTP 1.0,可以在请求的包头(Header)中添加Connection: Keep-Alive。 对于HTTP 1.1,所有的连接默认都是持久连接。
对于这两种场景,通常基于多线程的服务器很难应对。
C10K问题 对于前文提出的这种高并发问题,我们通常用C10K这一概念来描述。C10K—— Concurrently handling ten thousand connections,即并发10000个连接。对于单台服务器而言,根本无法承担,而采用多台服务器分布式又意味着高昂的成本。如何解决C10K问题?
Tornado Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的解决方案(服务器与框架的集合体)。
了解Tornado的原理 掌握Tornado的基本写法 掌握Tornado的基本模块 tornado.web tornado.ioloop tornado.httpserver tornado.options
tornado.ioloop tornado的核心io循环模块,封装了Linux的epoll和BSD的kqueue,tornado高性能的基石。2.4 options 在前面的示例中我们都是将服务端口的参数写死在程序中,很不灵活。 tornado为我们提供了一个便捷的工具,tornado.options模块——全局参数定义、存储、转换。
tornado.options.define() tornado.options.options 全局的options对象,所有定义的选项变量都会作为该对象的属性。
tornado.options.parse_command_line() 转换命令行参数,并将转换后的值对应的设置到全局options对象相关属性上。追加命令行参数的方式是–myoption=myvalue
tornado.options.parse_config_file(path) 从配置文件导入option,配置文件中的选项格式如下: myoption = “myvalue” myotheroption = “myothervalue”
日志 当我们在代码中调用parse_command_line()或者parse_config_file()的方法时,tornado会默认为我们配置标准logging模块,即默认开启了日志功能,并向标准输出(屏幕)打印日志信息。如果想关闭tornado默认的日志功能,可以在命令行中添加–logging=none 或者在代码中执行如下操作: from tornado.options import options, parse_command_line options.logging = None parse_command_line()
配置文件 我们看到在使用prase_config_file()的时候,配置文件的书写格式仍需要按照python的语法要求,其优势是可以直接将配置文件的参数转换设置到全局对象tornado.options.options中;然而,其不方便的地方在于需要在代码中调用tornado.options.define()来定义选项,而且不支持字典类型,故而在实际应用中大都不使用这种方法。在使用配置文件的时候,通常会新建一个python文件(如config.py),然后在里面直接定义python类型的变量(可以是字典类型);在需要配置文件参数的地方,将config.py作为模块导入,并使用其中的变量参数。
如config.py文件:
# conding:utf-8 # Redis配置 redis_options = { 'redis_host':'127.0.0.1', 'redis_port':6379, 'redis_pass':'', }