优势:
1. 轻量级的 web 框架, 和Django比
2. 性能卓越, 使用 异步非阻塞
3. 处理 C10K 的场景, C10K : concurrent(并发) 10000 , 能够同一时间处理10000个并发的连接
和Django对比:
django tornado
路由 有 有
模板 有 有
视图 有 有
ORM 有 无
session 有 无
cookie 有 有
form,admin, 中间件等 有 无
1. 单个进程打开的文件描述符(fd文件句柄)
select : 1024
poll : 稍微比select好一些, 没有限制
epoll : 没有限制 (1个g内存, 监听10W个端口)
2. 监听socket的方式:
select : 轮询, 一个一个的检查, 看有没有活跃, 当线性增加socket的时候,
轮询的速度就会非常的耗时
poll : 对select稍微进行了优化, 只是修改了文件描述符,监听方式不变
epoll : 会将连接的socket注册到epoll中, 相当于socket的花名册, 如果有一个socket活跃了,
会回调一个函数, 通知epoll,赶紧过来处理
3. 内存空间拷贝方式:
select : 需要将数据从内核态拷到用户态, 这个过程比较耗时
poll : 同上
epoll : 内存态数据和用户态数据时共享的
参考博客: https://www.cnblogs.com/jeakeven/p/5435916.html
import tornado.web
import tornado.ioloop
from tornado.options import options,define,parse_config_file,parse_command_line
import config
define('port',default=8002,type=int,)
class IndexHandler(tornado.web.RequestHandler):
def initialize(self):
print('hahha')
def get(self, *args, **kwargs):
self.write('hello world')
url=self.reverse_url('index')
print(url)
def post(self,*args,**kwargs):
pass
class Site(tornado.web.RequestHandler):
def initialize(self,username):
self.username = username
print('hahha')
def get(self, *args, **kwargs):
print(self.get_query_argument('pwd',None))
print(self.username)
self.write('hello world site')
def post(self,*args,**kwargs):
pass
if __name__ == '__main__':
# parse_command_line()
parse_config_file('config')
app = tornado.web.Application([
tornado.web.url(r'/site/', Site,{'username':'zzf'}),
tornado.web.url(r'/index/', IndexHandler,name='index'),
])
app.listen(config.options.get('port'))
tornado.ioloop.IOLoop.current().start()
传参与配置
1.
from tornado.options import options,define
define('port',default=8002,type=int,)
2.命令行
parse_command_line()
from tornado.options import options,parse_command_line
3.文件txt
parse_config_file('config')
app.listen(config.options.port)
4.配置文件
parse_config_file('config')
app.listen(config.options.get('port'))