Tornado的简单使用
目前python的三大框架
django是基于MTV模式的框架,大而全,开发效率高,自带ORM操作,后台管理,以及各种认证模块等;
Flask是轻量级的框架,自由,灵活,可扩展性很强;
Tornado主性能,采用异步非阻塞的方式,但很多功能模块交给了第三方去实现。
但现阶段使用tornado不是很多,尤其是现在Django3.0出了之后增加了异步处理的方式,而且开发效率上也比Tornado快,灵活性方面更多人会去选择使用Flask,而且即便是Django2+gevent使用协程的事件方式一样可以实现高并发,这块原理比较多,后面想单独总结写一篇这个。
Tornado目录结构
目录结构不像django会自动生成,由自己独立创建
server.py---主要是存放启动程序的代码
# coding=utf-8 import tornado.httpserver import tornado.web import tornado.ioloop import tornado.escape from tornado.options import define, options from handlers.urls.main_urls import handlers define("port", default=8003, help="run port", type=int) define("start", default=False, help="start server", type=bool) if __name__ == "__main__": options.parse_command_line() if options.start: app = tornado.web.Application(handlers) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) print('start server...') http_server.start(4) tornado.ioloop.IOLoop.instance().start()
tornado.ioloop
(1)tornado的核心io循环模块,封装了linux的epoll和BSD的kqueue,tornado高性能的基石
(2)epoll原理
(3)IOLoop.current(): 返回当前线程的IOLoop实例。
(4)IOLoop.start(): 启动IOLoop实例的IO循环,同时服务器监听被打开。
http_server.start()
定义进程的数量,建议与cpu核数一致,避免上下文切换的时间消耗
urls目录----存放程序url的地方
from handlers.main.main_handler import SMSHandler, EmailHandler handlers = [ (r'/sms', SMSHandler),
(r'/test', EmailHandler) ]
main目录----用来存放程序代码
# coding=utf-8
import tornado.web
import tornado.httpserver
from . import mailsender
class SMSHandler(tornado.web.RequestHandler): def initialize(self): self.mail = mailsender.MailSenderHandler() def get(self):
self.get_query_argument('param1','')
data = {"message":"123","status":0} self.finish(data) def post(self): self.mail.SendMail() data1 = self.get_body_argument('a1','') self.write("success")
initialize函数类似于__init__构造方法,这里当引入其它类的方法时,可以通过先定义生成一个实例,然后再引入进本地方法中。
获取参数的方法:
GET:get_query_argument()
POST:get_body_argument(),当参数不存在时可以定义默认值
self.finish()代表响应到前端的终结。并且可以在finsh后做一些与响应给前端无关的操作,缩短响应时间。
self.write()并不会马上将数据返回前端,必须在self.finsh()或者return后才会响应,类似以缓存吧。