另外一篇:http://www.cnblogs.com/xiaoshi657/p/6945208.html

基本版:

#coding=utf-8

import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop from tornado.options import options , define
define("port",default=8001,help="跑在8001",type=int) import time
class SleepHandler(tornado.web.RequestHandler):
def get(self):
time.sleep(5)
self.write("this is SleepHandler...") class DirectHandler(tornado.web.RequestHandler):
def get(self):
self.write("this is DirectHandler...") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers = [
(r"/d",DirectHandler),
(r"/s",SleepHandler),
],
debug = True
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

多进程版本

注意一定要关闭debug功能!!!否则:Cannot run in multiple processes: IOLoop instance

#coding:utf-8

import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop from tornado.options import options , define
define("port",default=8001,help="跑在8001",type=int) import time
class SleepHandler(tornado.web.RequestHandler):
def get(self):
time.sleep(10)
self.write("this is SleepHandler...") class DirectHandler(tornado.web.RequestHandler):
def get(self):
self.write("this is DirectHandler...") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers = [
(r"/d",DirectHandler),
(r"/s",SleepHandler),
],
debug = False
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(options.port)
http_server.start(0)
# [I 150610 10:42:05 process:115] Starting 4 processes
tornado.ioloop.IOLoop.instance().start()

bind文档翻译

def bind(self, port, address=None, family=socket.AF_UNSPEC, backlog=128):
"""
绑定server到指定地址的端口上。
调用start来启动server。如果想把这个server跑在单线程上,可以调用listen方法,listen是bind和start方法的单进程模式的“快捷键”。
地址可能是ip地址或者hostname。如果是hostname,server将监听其所有关联ip。
地址若是空字符串将监听不到任何可用接口。family参数可设置为socket.AF_INET或socket.AF_INET6来约定ipv4或者是ipv6地址,缺省情况下会启用所有可用的。
backlog参数与socket.listen同义。
bind方法会多次在start方法前调用来监听多个端口或者接口。
"""
sockets = bind_sockets(port, address=address, family=family,
backlog=backlog)
if self._started:
self.add_sockets(sockets)
else:
self._pending_sockets.extend(sockets)

start文档翻译

def start(self, num_processes=1):
"""
默认情况下,但进程运行server,不会fork任何额外的子进程。
如果num_processes为None或<=0 ,会根据机器的cpu核数fork子进程。若num_processes>=1,就fork这个数目的子进程。
因为我们使用的是进程而不是线程,所以不会在server code之间共享内存。 特别注意,多进程与自动装载模型不兼容。在调用TCPServer.start(n)前,任何IOLoop都不能创建和引用。
"""
assert not self._started
self._started = True
if num_processes != 1:
process.fork_processes(num_processes)
sockets = self._pending_sockets
self._pending_sockets = []
self.add_sockets(sockets)

异步版本1

#coding:utf-8

import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop from tornado.options import options , define
define("port",default=8001,help="跑在8001",type=int) import time
class SleepHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 5, callback=self.on_response) def on_response(self):
self.write("this is SleepHandler...")
self.finish() class DirectHandler(tornado.web.RequestHandler):
def get(self):
self.write("this is DirectHandler...") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers = [
(r"/d",DirectHandler),
(r"/s",SleepHandler),
],
debug = False
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(options.port)
http_server.start(1)
tornado.ioloop.IOLoop.instance().start()

将sleep.py的代码如上述一样改造,即在get()方法前面增加了装饰器@tornado.web.asynchronous,它的作用在于将tornado服务器本身默认的设置_auto_fininsh值修改为false。如果不用这个装饰器,客户端访问服务器的get()方法并得到返回值之后,两只之间的连接就断开了,但是用了@tornado.web.asynchronous之后,这个连接就不关闭,直到执行了self.finish()才关闭这个连接。

tornado.ioloop.IOLoop.instance().add_timeout()也是一个实现异步的函数,time.time()+17是给前面函数提供一个参数,这样实现了相当于time.sleep(17)的功能,不过,还没有完成,当这个操作完成之后,就执行回调函数on_response()中的self.render(“sleep.html”),并关闭连接self.finish()。 
https://github.com/qiwsir/StarterLearningPython/blob/master/309.md

异步版本二

#coding:utf-8

import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop
import tornado.gen from tornado.options import options , define
define("port",default=8001,help="跑在8001",type=int) import time
class SleepHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
#使用yield得到了一个生成器,先把流程挂起,等完全完毕,再唤醒继续执行。另,生成器都是异步的。
yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 5)
self.write("this is SleepHandler...") class DirectHandler(tornado.web.RequestHandler):
def get(self):
self.write("this is DirectHandler...") if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers = [
(r"/d",DirectHandler),
(r"/s",SleepHandler),
],
debug = False
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(options.port)
http_server.start(1)
tornado.ioloop.IOLoop.instance().start() 转自:https://blog.csdn.net/yongche_shi/article/details/53694145

Tornado 多进程 & 异步的更多相关文章

  1. Tornado的异步非阻塞

    阻塞和非阻塞Web框架 只有Tornado和Node.js是异步非阻塞的,其他所有的web框架都是阻塞式的. Tornado阻塞和非阻塞两种模式都支持. 阻塞式: 代表:Django.Flask.To ...

  2. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  3. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  4. 深入理解yield(三):yield与基于Tornado的异步回调

    转自:http://beginman.cn/python/2015/04/06/yield-via-Tornado/ 作者:BeginMan 版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须 ...

  5. tornado 之 异步非阻塞

    异步非阻塞 1.基本使用 装饰器 + Future 从而实现Tornado的异步非阻塞 import tornado.web import tornado.ioloop from tornado im ...

  6. 不得不注意tornado多进程部署的副作用

    tornado多进程启动时,采用的是fork的方式. 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(child process).fork函数被调用一次但返回两次 ...

  7. tornado 11 异步编程

    tornado 11 异步编程 一.同步与异步 同步 #含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 #现象:有一个共同的时钟,按来的顺序一个一个处理 #直观感受:需要等待,效率 ...

  8. Python核心框架tornado的异步协程的2种方式

    什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...

  9. Tornado中异步框架的使用

    tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...

随机推荐

  1. BZOJ3747 POI2015 Kinoman 【线段树】*

    BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...

  2. 关于ehcache缓存的使用(简单对比redis)

    前言 最近在做一个项目,某个接口查询数据到返回数据总计需要7000+毫秒,一直在考虑优化的问题,优化也有原来的一家一家查询到一次查询所有的,在查询不同天数.结果是1500+,虽然优化了不少,但是数据结 ...

  3. 如何向整个 Git 仓库补提交一个文件

    微软在 Reference Source 里开放了 .Net Framework 多个版本的源码.为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中. 但是!!!居然忘 ...

  4. web.xml中配置classpath:和classpath*:的区别和意思

    首先 classpath是指 WEB-INF文件夹下的classes目录 解释classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties s ...

  5. vue数据已渲染成 但还是报错 变量 undefined

    问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...

  6. 使用 Git 对原理图和线路板时行版本控制

    使用 Git 对原理图和线路板时行版本控制 由于之前一直用 Git 管理代码,我又开始试用 git 来对原理图和线路板时行版本控制. 由于 原理图和 PCB 的文件都是二进制文件,git 管理并不怎么 ...

  7. [LeetCode系列]翻转链表问题II

    给定一个链表和两个整数m, n, 翻转链表第m个节点到第n个节点(从1开始计数). 如, 给定链表: 1->2->3->4->5->NULL, 以及 m = 2, n = ...

  8. [语法]C语言中二维数组做输入参数

    C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...

  9. 【转载】chrome控制台中看见的cookie属性详解

    在chrome控制台中的resources选项卡中可以看到cookie的信息. 一个域名下面可能存在着很多个cookie对象. name字段为一个cookie的名称. value字段为一个cookie ...

  10. 打包python文件,让文件程序化

    通过对源文件打包,Python程序可以在没有安装 Python的环境中运行,也可以作为一个独立文件方便传递和管理. 现在网上主流的打包方式有两种py2exe或者pyinstaller两款多平台的Pyt ...