一、多线程和配置单线程
1.1自动开启多线程(不建议)
想要开启多线程需要借助# 服务器模块
import tornado.httpserver
# 服务器模块
import tornado.httpserver
# 实例化一个http服务器对象
httpServer = tornado.httpserver.HTTPServer(app)
# 将服务器绑定到指定端口
httpServer.bind(8000)
# 启动多个进程(5个),默认开启一个.
httpServer.start(5)
若这个值为None或者为负数,则会开启对于硬件机器的cpu核心数个子进程但不推荐这种方式因为:
- 每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程耦合度过高。
- 所有子进程都是一个命令启动的,无法做到在不停止服务的情况下修改代码。
- 所有进程共享一个端口,想要分别监控很困难。
1.2手动开启多线程(不建议)
由于自动开启有很多缺陷,所以我们来学习手动启动,使用黑终端命令启动,用不同的端口。
手动启动,接受黑终端的参数需要import tornado.options的协助。
# 全局的参数定义、存储、转换模块
import tornado.options
# 定义两个全局变量
tornado.options.define('port',default=8000,type=int)
tornado.options.define('list',default=[],type=str,multiple=True)
# 准换命令行参数,保存到tornado.options.optrons
tornado.options.parse_command_line()
# 测试list是否可以正常接收
print("list:",tornado.options.options.list)
# 全局变量使用
httpServer.bind(tornado.options.options.port)
# 在我的电脑测试这个需要开一个线程,如果注释掉地址无法访问
httpServer.start(1)
这时代码需要在黑终端启动,不然无法传参(也可配置中传参)
# 启动命令
python ./app.py --port=8001 --list=1,2,3
1.3从配置文件中设置单线程(常用)
在配置文件中使用的话需要将命令行转化参数的代码**tornado.options.parse_command_line()**去掉
配置文件就是在同目录下创建一个config.py,然后更具自己的目录导入
from 单进程和多进程 import config
config.py内容为
# 选项
options = {
'port' : 7001,
'list' : ["good","nice","handsome"]
}
导入好后,可以直接调用
print("list:",config.options['list'])
print("port:",config.options['port'])
# 全局变量使用
httpServer.bind(config.options['port'])
这时服务就不需要用终端启动了,直接run就可。
二、完整代码
代码需要在同目录添加一个config.py,并配置port和list就可以直接启动。
# tornado的基础web框架模块
import tornado.web
# tornado的核心IO循环模块,封装了Linux的epoll和BSD的kqueue
import tornado.ioloop
# 服务器模块
import tornado.httpserver
# 全局的参数定义、存储、转换模块
# import tornado.options
# 导入配置文件
from 单进程和多进程 import config
# 业务处理类
class IndexHandler(tornado.web.RequestHandler):
def get(self,*args,**kwargs):
self.write("hello world")
# 路由匹配
app = tornado.web.Application([
(r"/",IndexHandler)
])
# 端口监听
# app.listen(8000)
# 实例化一个http服务器对象
httpServer = tornado.httpserver.HTTPServer(app)
# 绑定端口
# httpServer.listen(8900)
# 将服务器绑定到指定端口
# httpServer.bind(8000)
"""
若这个值为None或者为负数,则会开启对于硬件机器的cpu核心数个子进程
但不推荐这种方式因为:
1.每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程耦合度过高。
2.所有子进程都是一个命令启动的,无法做到在不停止服务的情况下修改代码。
3.所有进程共享一个端口,想要分别监控很困难。
"""
# 启动多个进程(5个),默认开启一个.
# httpServer.start(5)
"""
所以我们学习手动启动,使用黑终端命令启动,用不同的端口。
1.定义全局变量
2.接受命令行参数,并保存到tornado.options.optrons
"""
# 定义两个全局变量
# tornado.options.define('port',default=8000,type=int)
# tornado.options.define('list',default=[],type=str,multiple=True)
# 转换命令行参数,保存到tornado.options.optrons
# tornado.options.parse_command_line()
# print("list:",tornado.options.options.list)
"""
我们用的最多的是配置文件中启动
1.配置config文件
2.映入config
"""
print("list:",config.options['list'])
print("port:",config.options['port'])
# 全局变量使用
httpServer.bind(config.options['port'])
httpServer.start(1)
if __name__ == '__main__':
# tornado启动
tornado.ioloop.IOLoop.current().start()