另外一篇: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. HDU - 2973:YAPTCHA (威尔逊定理)

    The math department has been having problems lately. Due to immense amount of unsolicited automated ...

  2. SVN 如何更新整个目录

    SVN 有时会遇到更新整个目录的情况, 比如依赖的某个库有了新版本, 需要更新. 这个时候的处理可能需要注意一些问题.(直接跳到最后看结论) 举个例子: 根文件是 test, 里面用 external ...

  3. 监听器(Listener)学习(二)在开发中的常见应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用: 统计当前在线人数 自定义Session扫描器 一.统计当前在线人数 在JavaWeb应用开发中,有时候 ...

  4. bzoj 1858 序列操作

    bzoj 1858 序列操作 带有随机多个区间单值覆盖的区间操作题,可考虑用珂朵莉树解决. #include<bits/stdc++.h> using namespace std; #de ...

  5. LeetCode 430. Flatten a Multilevel Doubly Linked List

    原题链接在这里:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/description/ 题目: You a ...

  6. cocostudio ui编辑器 使用心得

    1 c++包含路径 2九宫格设置 cocostudio ui编辑器设置九宫格x,y,w,h是从图片左上角开始测量,然后调整尺寸就行了. 2.  如果点了自适应  panel会在加载json的时候被设置 ...

  7. 【转】简明 Python 教程

    原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程Swaroop, C. H. 著沈洁元  译www.byteof ...

  8. hadoop 之Hadoop生态系统

    1.Hadoop生态系统概况 Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. Hadoop的核心是HDFS和Mapreduce,hadoop2.0还包括YAR ...

  9. Oracle 块修改跟踪 (Block Change Tracking) 说明

    Block ChangeTracking 是Oracle 10g里推出的特性.官网对Block change tracking 的定义如下: Adatabase option that causes ...

  10. RK3288 添加WiFi&BT模块AP6212

    CPU:RK3288 系统:Android 5.1 注:系统中自带的模块没有AP6212,相近的只有AP6210,设置为AP6210,直接添加固件也可以正常使用. 此文是手动添加AP6212的例程. ...