近期开始看tornado,接手公司web项目. 今天下午github不知何故.卡顿连不上. 整理基础知识在此.
pip安装tornado
测试tornado是否安装成功,基础示例 . 启动tornado.web实例. 监听端口 访问返回字符串
import tornado.web
import tornado.ioloop
#类比django中的视图 习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
#实例化应用对象 Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
#有一个listen方法创建了一个http服务器示例 并绑定了端口
app = tornado.web.Application([
(r"/",IndexHandler)
])
app.listen(8000)
'''IOLoop.current()
返回当前线程的IOLoop实例
.start():启动IOLoop实例的I/O循环
'''
tornado.ioloop.IOLoop.current().start()
更换app.listen()方式启动. 实例化一个HTTPserver来启动.
import tornado.web
import tornado.ioloop
import tornado.httpserver
#类比django中的视图 习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
#实例化应用对象 Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
#有一个listen方法创建了一个http服务器示例 并绑定了端口
app = tornado.web.Application([
(r"/",IndexHandler)
])
#app.listen(8000)
#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.listen(8000)
'''IOLoop.current()
返回当前线程的IOLoop实例
.start():启动IOLoop实例的I/O循环
'''
tornado.ioloop.IOLoop.current().start()
三.增加多线程启动方式
import tornado.web
import tornado.ioloop
import tornado.httpserver
#类比django中的视图 习惯用法加上Handler
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
#实例化应用对象 Application: 是tornado web框架的核心应用类 ,是与服务器对应的接口 里面保存了路由映射表
#有一个listen方法创建了一个http服务器示例 并绑定了端口
app = tornado.web.Application([
(r"/",IndexHandler)
])
#app.listen(8000) #方法一 单进程模式
#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
#httpServer.listen(8000) #方法二 方法二拆分为下面方法三
httpServer.bind(8000)
httpServer.start(5) #指定进程数 如为None或者小于等于0则根据cpu核心数进行创建
'''IOLoop.current()
返回当前线程的IOLoop实例
.start():启动IOLoop实例的I/O循环
'''
tornado.ioloop.IOLoop.current().start()
但是
'''
不用上述方式启动的问题 问题一:每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会
影响所有的子进程
2.所有的进程都是由一个命令启动的(python server.py),无法做到在不停止服务的情况下修改代码.
3.所有进程共享一个端口,想要分别监控很困难
'''
四 . tornado的options
创建2个tornado.options.define 并调用
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
#1.基础方法 定义2个参数
tornado.options.define(name="port",default=8000,type=int,help="This is a port",
metavar=None,multiple=False,group=None,callback=None)
'''
type 变量类型 从命令行或配置导入参数值 如果没有设置type,则按default的类型.如果没有default,则不转换
multiple 设置选项变量是否为多个值,默认为False(比如传列表)
help 变量的提示信息,一般不用
'''
tornado.options.define('list',default=[],type=str,multiple=True)
#2.属性 全局的options对象,所有定义的选项变量都会作为该对象的属性
tornado.options.options
#3.获取参数的方法 转换命令行参数
#tornado.options.parse_command_line()
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
tornado.options.parse_command_line() #转换2个参数并保存到tornado.options.options 下面可以使用变量的值
print('list=',tornado.options.options.list)
app = tornado.web.Application([
(r"/",IndexHandler)
])
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.bind(tornado.options.options.port)
httpServer.start(1)
tornado.ioloop.IOLoop.current().start()
以上代码可以用命令行传入参数 python server04.py --port=7890 --list=wo,ni --logging=None
五.使用配置文件方式
新建文件config
port = 7000
list = ['new','current','old']
从文件中读取配置
tornado.options.parse_config_file
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
#1.基础方法 定义2个参数
tornado.options.define(name="port",default=8000,type=int,help="This is a port",
metavar=None,multiple=False,group=None,callback=None)
'''
type 变量类型 从命令行或配置导入参数值 如果没有设置type,则按default的类型.如果没有default,则不转换
multiple 设置选项变量是否为多个值,默认为False(比如穿列表)
help 变量的提示信息,一般不用
'''
tornado.options.define('list',default=[],type=str,multiple=True)
#2.属性 全局的options对象,所有定义的选项变量都会作为该对象的属性
tornado.options.options
#3.获取参数的方法 转换命令行参数
#tornado.options.parse_command_line()
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
tornado.options.options.logging = None
tornado.options.parse_config_file(path='config') #从配置文件读取
print('list=',tornado.options.options.list)
app = tornado.web.Application([
(r"/",IndexHandler)
])
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.bind(tornado.options.options.port)
httpServer.start(1)
tornado.ioloop.IOLoop.current().start()
#不建议使用以上方式, 因为书写格式仍然需要安装python的语法要求 2.不支持字典类型
#最终版本 创建一个名为config.py的普通文件,当做模块来用
六 最终版本 创建config.py模块 从模块中读取配置
config.py文件内容
# 参数
options = {
"port": 8080,
"list": ['year', 'month', 'day']
}
示例代码 导入config模块,读取其中的配置内容
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import config
class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.write('Hsingpu is a good man')
def post(self, *args, **kwargs):
pass
if __name__ == '__main__':
#直接调用配置文件中
print('list=',config.options['list'])
app = tornado.web.Application([
(r"/",IndexHandler)
])
httpServer=tornado.httpserver.HTTPServer(app)
#直接调用配置文件中的
httpServer.bind(config.options['port'])
httpServer.start(1)
tornado.ioloop.IOLoop.current().start()
app.listen(8000)
#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.listen(8000)
#实例化一个http服务器对象 并 绑定端口
httpServer=tornado.httpserver.HTTPServer(app)
#httpServer.listen(8000) #方法二 方法二拆分为下面方法三
httpServer.bind(8000)
httpServer.start(5) #指定进程数 如为None或者小于等于0则根据cpu核心数进行创建
读取配置三种方式
#tornado.options.parse_command_line()
tornado.options.parse_config_file(path='config') #从配置文件读取
httpServer.bind(config.options['port'])
命令行传参关闭
python server04.py --port=7890 --list=['wo','ni'] --logging=None
代码关闭
tornado.options.options.logging = None
tornado的IOLoop调用epoll
高效:epoll管理socket 还有异步