第一种启动方式:单进程

import tornado.web       # web服务
import tornado.ioloop # I/O 时间循环 class Mainhandler(tornado.web.RequestHandler):
def get(self):
self.write("hello world!") # 建立路由表
app = tornado.web.Application([
(r"/index", Mainhandler),
]) if __name__ == "__main__":
app.listen(8000) # 监听端口
# tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.instance().start() # 开始事件

app.listen()这个方法只能在单进程模式中使用。

对于app.listen()与方式二中的手动创建HTTPServer实例这两种方式,建议大家先使用后者即创建HTTPServer实例的方式,因为其对于理解tornado web应用工作流程的完整性有帮助,便于大家记忆tornado开发的模块组成和程序结构;在熟练使用后,可以改为简写。

第二种启动方式:单进程

import tornado.web         # web服务
import tornado.ioloop # I/O 时间循环
import tornado.httpserver # 新引入httpserver模块,单线程的http服务 class Mainhandler(tornado.web.RequestHandler):
def get(self):
self.write("hello world!") # 建立路由表
app = tornado.web.Application([
(r"/index", Mainhandler),
]) if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
# tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.instance().start() # 开始事件

在这一修改版本中,我们引入了tornado.httpserver模块,顾名思义,它就是tornado的HTTP服务器实现。

我们创建了一个HTTP服务器实例http_server,因为服务器要服务于我们刚刚建立的web应用,将接收到的客户端请求通过web应用中的路由映射表引导到对应的handler中,所以在构建http_server对象的时候需要传出web应用对象app。http_server.listen(8000)将服务器绑定到8000端口。

实际上一版代码中app.listen(8000)正是对这一过程的简写。

第二种启动方式:多进程

import tornado.web         # web服务
import tornado.ioloop # I/O 时间循环
import tornado.httpserver # 新引入httpserver模块,单线程的http服务 class Mainhandler(tornado.web.RequestHandler):
def get(self):
self.write("hello world!") # 建立路由表
app = tornado.web.Application([
(r"/index", Mainhandler),
]) if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(8000)
http_server.start(3)
# tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.instance().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)这两行代码。

第三种启动方式:多进程

import tornado.web         # web服务
import tornado.ioloop # I/O 时间循环
import tornado.httpserver # 新引入httpserver模块,单线程的http服务 class Mainhandler(tornado.web.RequestHandler):
def get(self):
self.write("hello world!") # 建立路由表
app = tornado.web.Application([
(r"/index", Mainhandler),
]) if __name__ == "__main__":
sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0) # 10
http_server = tornado.httpserver.HTTPServer(app)
http_server.add_sockets(sockets)
# tornado.ioloop.IOLoop.current().start()
tornado.ioloop.IOLoop.instance().start() # 开始事件

https://www.jianshu.com/p/41de38591e19

https://blog.csdn.net/fenglei0415/article/details/84029012

https://blog.csdn.net/u014252563/article/details/51532284

Tornado—三种启动tornado的方式的更多相关文章

  1. 3种启动tornado的方式

    r"""A non-blocking, single-threaded HTTP server. 翻译: 一个非阻塞的单线程HTTP服务器 A server is def ...

  2. spring-boot的三种启动方式[z]

    https://blog.csdn.net/u011425751/article/details/79507386 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记, ...

  3. spring boot快速入门 1 :创建项目、 三种启动项目方式

    准备工作: (转载)IDEA新建项目时,没有Spring Initializr选项 最近开始使用IDEA作为开发工具,然后也是打算开始学习使用spring boot. 看着博客来进行操作上手sprin ...

  4. spring-boot的三种启动方式

    spring-boot的启动方式主要有三种: 1. 运行带有main方法类 2. 通过命令行 java -jar 的方式 3. 通过spring-boot-plugin的方式 一.执行带有main方法 ...

  5. 三种Tomcat集群方式的优缺点分析

    三种Tomcat集群方式的优缺点分析 2009-09-01 10:00 kit_lo kit_lo的博客 字号:T | T 本文对三种Tomcat集群方式的优缺点进行了分析.三种集群方式分别是:使用D ...

  6. Spring中三种配置Bean的方式

    Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...

  7. STM32三种启动模式 boot0 boot1

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash.2)SRAM=芯片内置的RAM区,就是内存啦.3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个 ...

  8. 三种Singleton的实现方式

    来源:http://melin.iteye.com/blog/838258 三种Singleton的实现方式,一种是用大家熟悉的DCL,另外两种使用cas特性来实现. public class Laz ...

  9. Request三种获取数据的方式

    今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...

随机推荐

  1. [TimLinux] Python Django myblog启动

    1. myblog介绍 自己给自己定的一个学习项目,用于: 使用学到的Python Web开发技术,框架django 使用学到的CSS技术,实现前端功能 使用学到的Axure工具,画出前端页面功能草图 ...

  2. HDU5919 Sequence II(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  3. CoderForces-913-C

    A New Year party is not a New Year party without lemonade! As usual, you are expecting a lot of gues ...

  4. csuoj-1900 锋芒毕露

    Description 小闪最近迷上了二刀流——不过他耍的其实是剑——新买了一个宝库用来专门存放自己收集的双剑.一对剑有两把,分只能左手用的和只能右手用的,各自有一个攻击力数值.虽然一对剑在小闪刚拿到 ...

  5. HDU-1027Ignatius and princess II

    Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about ...

  6. python数学工具(一)

    python  数学工具包括: 1.函数的逼近 1.1.回归 1.2.插值 2.凸优化3.积分4.符号数学 本文介绍函数的逼近的回归方法 1.作为基函数的单项式 对函数 的拟合 首先定义函数并且可视化 ...

  7. 【Redis】270- 你需要知道的那些 redis 数据结构

    本文出自「掘金社区」,欢迎戳「阅读原文」链接和作者进行技术交流 ?? 作者简介 世宇,一个喜欢吉他.MDD 摄影.自走棋的工程师,属于饿了么上海物流研发部.目前负责的是网格商圈.代理商基础产线,平时喜 ...

  8. Lua-Async 协程的高级用法

    Lua-Async 这是一个基于协程的异步调用库, 该库的设计思路类似JavaScript的Promise, 但相比Promise, 它有更多的灵活性. -- 引入Async local Async ...

  9. js中 forEach 和 map 区别

    共同点: 1.都是循环遍历数组中的每一项. 2.forEach()和map()里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input. 3.匿名函数中 ...

  10. 11个点让你的Spring Boot启动更快

    前言 使用的是 OpenJDK 11. java --version openjdk 11.0.1 2018-10-16 OpenJDK Runtime Environment 18.9 (build ...