Tornado简介和安装

Tornado框架

mark

框架特性和使用场景

  • 优势

    • 微框架、高性能、抗负载能力、搞并发
    • 异步支持: 异步非阻塞IO的处理方式
  • 缺点

    • 轮子少,不像Django,Flask等框架有大量插件支持
    • 缺少最佳实践,使用的公司不多,学习资料少
  • 构建微服务

    • 不适合复杂的CMS(内容管理系统)应用
    • 适合构建网站或者App后端微服务

学习资料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
同步:
含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系
现象:有一个共同的时钟,按来的顺序一个一个处理
直观感受:就是需要等候,效率低下

异步:
含义:双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位
现象:没有共同的时钟,不考虑顺序来了就处理
直观感受:就是不用等了,效率高

阻塞调用:
含义:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回
现象:读套接字时没有数据等数据来,写套接字时写不下了也一直等,等能写下了往里写(套接字被写满的原因不在本地,在于网络另一头的套接字被写满了来不及读出去,导致本地的套接字内容来发不出去堵住了)
直观感受:执着

非阻塞调用:
含义:非阻塞调用是指没有调用结果立即返回,当前线程不被挂起,可以继续做其它工作
现象:读套接字时没有数据,不等直接返回干别的事去,写套接字写不下了也不写了,直接返回干别的事去
直观感受:勤奋

安装

1
2
3
pip install tornado 
# 运行,浏览器访问127.0.0.1:8888 或者使用curl命令测试
python testapp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# testapp.py
# tornado的核心IO循环模块,封装了linux的epoll和BSD的kqueue,是tornado高效的基础
import tornado.ioloop
# tornado的基础web框架模块
import tornado.web

class MainHandler(tornado.web.RequestHandler):
def get(self):
# 对应http请求的方法,给浏览器响应信息
self.write("Hello, Tornado")

def make_app():
# 实例化一个make_app对象
# Application是tornado web框架的核心应用类,是与服务器对应的接口,里面保存了路由映射表
return tornado.web.Application([
(r"/", MainHandler),
])

# 执行时name名为__main__,其他调用时为文件名
if __name__ == "__main__":
app = make_app()
# 绑定监听端口,此时服务并没有开启监听
# http_server.bind(8888)、http_server.start()相当于http_server.listen(8888); http_server = tornado.httpserver.HTTPServer(app)加.listen(8888)相当于app.listen(8888)
app.listen(8888)
# app.listen() 只能在单进程中使用,因为没指定要创建几个进程。
# IOLoop.current():返回当前线程的IOLoop实例
# IOLoop.start():启动IOLoop实例的I/O循环,并且开启了监听
tornado.ioloop.IOLoop.current().start()

1
2
3
4
5
tornado启动多进程建议是手动运行启动多个,不建议在start()方法中定义多个进程。
原因:
1、每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop会影响所有的子进程。
2、所有的进程都是一个命令启动的,无法做到在不停止服务的情况下修改代码。
3、所有进程共享一个端口,想要分别监控很困难。
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。