Import tornado.web # tornado的基础web框架模块web
Import tornado.ioloop # tornado的核心IO模块, 封装了Linux的epoll模块服务器
一. Tornado服务的启动要素:app
1. 核心代码以下:框架
Tornado.web.Application().listen(端口, ip) # 配置tornado参数, listen()用来设置http请求相关,服务没有启动tornado
Tornado.ioloop.IOLoop.instance().start() # 开始事件循环, 启服务oop
一般在Tornado.web.Application()对象实例化时, 给Application类传入路由映射表及setings配置信息.spa
解析Application是Tornado.web框架的核心应用类, 是与服务器对应的接口.3d
2. 手动建立http服务器server
上面在实例化Application类后直接调用的listen()方法来设置的http请求服务器, 咱们没法进行些个性化配置对象
手动建立http服务器可实现, 以下:
Import tornado.httpserver # 引入内置模块,来改写下启服务以前的代码:
obj = tornado.web.Application([(路由映射关系), ...])
httpserver = tornado.httpserver.HTTPServer( obj ) # 这两行和起来的做用至关于上面的一个listen()方法
Httpserver.listen(8000)
此处的listen()方法和1中的listen不是同一个, 注意区分
3. Tornado的单进程与多进程:
以上启动的服务都是单进程下运行的, 如何启动多进程?
obj = tornado.web.Application([(路由映射关系), ...])
httpserver = tornado.httpserver.HTTPServer( obj ) # 把httpserve和Application关联, 以便能读到配置的路由
httpserver.bind(8000) # 此处不用listen方法了,注意
Httpserver.start(5) # 开启指定数量进程. 不指定时默认开启1个进程; 0,负数,None时都开启cpu核数进程
注意: 1中截图内的app.listen()方法只能在但进程模式中使用
3中启动多进程的方式有些问题, 不建议使用. 问题有:(1)启动的5个进程都属于子进程, 会从父进程
中各自复制一份IOLoop,如在建立子进程前修改了IOLoop,会影响全部子进程; (2)全部进程都是由
一个命令启动的, 没法作到在不中止服务的状况下修改代码. (3)全部进程共享一个端口, 想要分别
监控很困难.