Tornado 多进程 & 异步
另外一篇: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 多进程 & 异步的更多相关文章
- Tornado的异步非阻塞
阻塞和非阻塞Web框架 只有Tornado和Node.js是异步非阻塞的,其他所有的web框架都是阻塞式的. Tornado阻塞和非阻塞两种模式都支持. 阻塞式: 代表:Django.Flask.To ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- 在 tornado 中异步无阻塞的执行耗时任务
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- 深入理解yield(三):yield与基于Tornado的异步回调
转自:http://beginman.cn/python/2015/04/06/yield-via-Tornado/ 作者:BeginMan 版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须 ...
- tornado 之 异步非阻塞
异步非阻塞 1.基本使用 装饰器 + Future 从而实现Tornado的异步非阻塞 import tornado.web import tornado.ioloop from tornado im ...
- 不得不注意tornado多进程部署的副作用
tornado多进程启动时,采用的是fork的方式. 一个现有进程可以调用fork函数创建一个新进程.由fork创建的新进程被称为子进程(child process).fork函数被调用一次但返回两次 ...
- tornado 11 异步编程
tornado 11 异步编程 一.同步与异步 同步 #含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 #现象:有一个共同的时钟,按来的顺序一个一个处理 #直观感受:需要等待,效率 ...
- Python核心框架tornado的异步协程的2种方式
什么是异步? 含义 :双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位 现象:没有共同的时钟,不考虑顺序来了 ...
- Tornado中异步框架的使用
tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...
随机推荐
- Vim:基础
Normal模式 即是command “vim test.txt” 时进入的界面. 常用command: :help<Enter> 查看命令. :wq<Enter> ...
- Cookie用法
//写入 protected void Button1_Click(object sender, EventArgs e) { HttpCookie cookie=new HttpCookie(&qu ...
- biginteger转Long
pjProDocumentFolderTreeNodeBySeqnoDTO.setFolderId(((java.math.BigInteger) objects[0]).longValue()); ...
- 《DSP using MATLAB》示例Example 8.13
%% ------------------------------------------------------------------------ %% Output Info about thi ...
- 网络赛牡丹江赛区E ZOJ3813(线段树)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5345 给定序列P,定义序列S为P反复重复得到的一个无穷长的序列: if P = ...
- hadoop之 hadoop用途方向
hadoop是什么?Hadoop是一个开源的框架,可编写和运行分不是应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式.Hadoop=HDFS(文 ...
- 登录MySQL非默认3306端口号的语句
这里登陆的是mysql3308端口号的数据库 mysql -P3308 -p用户名 -u密码
- java多线程(2) 线程同步
我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步. 例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public c ...
- Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较
一.Ignite简介 Apache Ignite 内存数组组织框架是一个高性能.集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不 ...
- sorl基本原理
索引原理 场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索 ...