Tornado初见

Tornado概念

Tornado主要为减少并发连接产生的开销(传统一个连接起一个线程,如Django,但单台服务器并处理不了太高的并发,集群又耗资金),而tornado利用线程进行循环响应,因此,所有代码必须是异步和非阻塞的,不能阻塞等待,太耗时,并且长连接保持

  • 异步:非顺序执行,不需要等待返回,结束之前就可走,等待调用即可。异步函数在函数运行结束前便返回,而且通常会在程序中触发一些动作然后在后台执行一些任务。主要的一个实例就是按钮button,我们可以发现在html页面中button代码可能会写在其他程序前,但并不用先执行button,再执行后面的代码,而是后面代码先执行,button只是绑定了一个回调,当点击时,回调启动。Tornado利用协程编写异步代码,关键字yield替代链式回调实现挂起和继续程序执行

  • 非阻塞io:属于同步IO,系统调用,发现没有数据,离开做自己的事情,过一阵再来,不同干等

  • 长连接:一般来说一次http请求需要建立一次tcp连接,比较费时,因此利用长连接保持,在http的header里可看到Connection:keep-alive

  • 轻量级,少而精,性能优越

安装

pip install tornado

tornado的基本模块

  • tornado.web
  • tornado.ioloop
  • tornado.httpserver
  • tornado.options
tornado.web
  • RequestHandler

封装了对应一个请求的所有信息和方法,get,post等

  • Application

Tornado web框架的核心应用类,与服务器对接,保存了路由信息表,将接受到的客户端请求通过web应用中的路由映射表引导到相应的handler中,也就是响应类

tornado.ioloop

封装了epoll和kqueue,tornado高性能的基石

  • IOLoop.current() 返回当前线程的实例
  • IOLoop.start() 启动IOLoop实例的I/O循环,服务器监听打开
tornado.httpserver

tornado的服务器,服务于我们建立的应用

tornado.options
  • tornado.options.define(),定义options选项变量,定义的变量可在全局的tornado.options.options中获取使用

    1. name 选项变量名,唯一
    2. default name的默认值,不传为NONE
    3. type name的类型
    4. multiple name的值是否可以多个,布尔类型,默认为False,若为True,那么设置选项变量时值与值之间用英文逗号分隔,而选项变量则是一个list列表
    5. help name帮助提示信息
  • tornado.options.options

全局的options对象,所有定义的选项变量都会作为该对象的属性

  • tornado.options.parse_command_line()

转化命令行参数,并将转换后的值设置到对应的全局变量options对象相关属性上,并且输入的选项必须define,输入格式为–myoption=myvalue,例

python **.py --port=** 
  • tornado.options.parse_config_file(path)

从配置文件导入option,配置文件格式

myoption = "myvalue"
myotheroption = "myothervalue"

hello world

# coding:utf-8

import tornado.web
import tornado.ioloop
import tornado.httpserver 

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello World!")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application([
        (r"/", IndexHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(app) 
    http_server.listen(tornado.options.options.port)
    tornado.ioloop.IOLoop.current().start()
  • app = tornado.web.Application([(r”/”, IndexHandler),]), 路由和handler绑定
  • http_server = tornado.httpserver.HTTPServer(app), 构建http_server服务器对象,将app传入绑定
  • http_server.listen(tornado.options.options.port),绑定port, 代码等同如下
http_server.bind(8000)  #绑定端口 
http_server.start(1)    #指定开启几个进程

http_server.bind(port)方法是将服务器绑定到指定端口。
http_server.start(num_processes=1)方法指定开启几个进程,参数num_processes默认值为1,即默认仅开启一个进程;如果num_processes为None或者<=0,则自动根据机器硬件的cpu核芯数创建同等数目的子进程;如果num_processes>0,则创建num_processes个子进程。

参考:https://blog.csdn.net/belalds/article/details/80575755

猜你喜欢

转载自blog.csdn.net/pupoqian3720/article/details/81488245