python tornado (2)多线程

Tornado合集

一、多线程和配置单线程

1.1自动开启多线程(不建议)

想要开启多线程需要借助# 服务器模块
import tornado.httpserver

# 服务器模块
import tornado.httpserver

# 实例化一个http服务器对象
httpServer = tornado.httpserver.HTTPServer(app)

# 将服务器绑定到指定端口
httpServer.bind(8000)

# 启动多个进程(5个),默认开启一个.
httpServer.start(5)

若这个值为None或者为负数,则会开启对于硬件机器的cpu核心数个子进程但不推荐这种方式因为:

  1. 每个子进程都会从父进程中复制一份IOLoop的实例,如果在创建子进程前修改了IOLoop,会影响所有的子进程耦合度过高。
  2. 所有子进程都是一个命令启动的,无法做到在不停止服务的情况下修改代码。
  3. 所有进程共享一个端口,想要分别监控很困难。

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值