Tornado框架知识系列之二
来源:互联网 发布:javascript入门 pdf 编辑:程序博客网 时间:2024/05/17 23:45
1,httpserver
修改上篇文章简单tornado案例的代码如下:
import tornado.webimport tornado.ioloopimport tornado.httpserver # 新引入httpserver模块class IndexHandler(tornado.web.RequestHandler): """主路由处理类""" def get(self): """对应http的get请求方式""" self.write("Hello Itcast!")if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) # ------------------------------ # 我们修改这个部分 # app.listen(8000) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000) # ------------------------------ tornado.ioloop.IOLoop.current().start()
在这一修改版本中,我们引入了tornado.httpserver模块,顾名思义,它就是tornado的HTTP服务器实现。
我们创建了一个HTTP服务器实例http_server,因为服务器要服务于我们刚刚建立的web应用,将接收到的客户端请求通过web应用中的路由映射表引导到对应的handler中,所以在构建http_server对象的时候需要传出web应用对象app。http_server.listen(8000)将服务器绑定到8000端口。
实际上一版代码中app.listen(8000)正是对这一过程的简写。
关于app.listen()
app.listen()这个方法只能在单进程模式中使用。
对于app.listen()与手动创建HTTPServer实例
http_server = tornado.httpserver.HTTPServer(app) http_server.listen(8000)
这两种方式,建议大家先使用后者即创建HTTPServer实例的方式,因为其对于理解tornado web应用工作流程的完整性有帮助,便于大家记忆tornado开发的模块组成和程序结构;在熟练使用后,可以改为简写。
2,单进程与多进程
修改上面httpserver版本代码如下:
import tornado.webimport tornado.ioloopimport tornado.httpserver class IndexHandler(tornado.web.RequestHandler): """主路由处理类""" def get(self): """对应http的get请求方式""" self.write("Hello Itcast!")if __name__ == "__main__": app = tornado.web.Application([ (r"/", IndexHandler), ]) http_server = tornado.httpserver.HTTPServer(app) # -----------修改---------------- http_server.bind(8000) http_server.start(0) # ------------------------------ tornado.ioloop.IOLoop.current().start()
http_server.bind(port)方法是将服务器绑定到指定端口。
http_server.start(num_processes=1)方法指定开启几个进程,参数num_processes默认值为1,即默认仅开启一个进程;
如果num_processes为None或者<=0,则自动根据机器硬件的cpu核芯数创建同等数目的子进程;如果num_processes>0,则创建num_processes个子进程。
我们在前面写的http_server.listen(8000)实际上就等同于:
http_server.bind(8000)http_server.start(1)
关于多进程
虽然tornado给我们提供了一次开启多个进程的方法,但是由于:
每个子进程都会从父进程中复制一份IOLoop实例,如果在创建子进程前我们的代码动了IOLoop实例,那么会影响到每一个子进程,势必会干扰到子进程IOLoop的工作;
所有进程是由一个命令一次开启的,也就无法做到在不停服务的情况下更新代码;
所有进程共享同一个端口,想要分别单独监控每一个进程就很困难。
不建议使用这种多进程的方式,而是建议手动开启多个进程,并且绑定不同的端口。
- Tornado框架知识系列之二
- Tornado框架知识系列之三
- Tornado框架知识系列之四
- Tornado框架知识系列之五
- Tornado框架知识系列之一
- Flask框架知识系列之二
- tornado系列二:模板
- (二)Web框架-龙卷风Tornado之世界上最简单的Tornado示例
- Flask框架知识系列之三
- Flask框架知识系列之四
- ajax知识总结系列之二
- Klocwork系列脚本之Tornado部分使用说明
- Python之路【第二十篇】Tornado框架
- Tornado框架
- Tornado框架
- tornado系列一:tornado基础
- .NET安全系列之二:独立存储区相关知识
- MyBatis知识系列之二:针对MyBatis的CRUD操作
- 20170801 JAVA用三重循环解决比赛分组逻辑问题
- 对于一串数据如何判别是否为IP地址
- FreeMarker之制作自定义标签及遍历
- 单例设计模式(饿汉式和懒汉式)
- JPA教程:JPA概述、JPA实体生命周期、JPA实体映射关系、JPA查询语言
- Tornado框架知识系列之二
- BLE蓝牙hid键盘表
- 关于ios push转场的时候一级界面一些控件会有短暂停留的问题
- 20170801 JAVA查找0-100质数并输出
- PHP静态成员变量和非静态成员变量
- 二叉树的创建,插入,删除,输出,求高度,求度以及三种遍历方式实现
- Chapter 2 The Graphics Rendering Pipeline
- 计算结果总是100的程序
- ZCMU新人训练赛A