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框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...
随机推荐
- BZOJ:5457: 城市(线段树合并)(尚待优化)
5457: 城市 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 18 Solved: 12[Submit][Status][Discuss] Des ...
- THREE.OrbitControls初始化设置位移/旋转/滚轮
let oldController;//已知的一个controller //初始化旋转(鼠标左键的操作) let position=oldController.object.position; cam ...
- Hash学习小结
Hash 简要说明 \(OI\)中一般采用进制\(hash\).模数可以用\(unsigned \ long \ long\)自然溢出,也可以使用大质数.值得一提的是,\(unsigned\ long ...
- GCD 深入理解(二)
转自@nixzhu的GitHub主页(译者:Riven.@nixzhu),原文<Grand Central Dispatch In-Depth: Part 2/2> 欢迎来到GCD深入理解 ...
- bat总结1
获取当前目录 @echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前批处理全路径:%~f0echo 当前C ...
- python 时间日期处理
refer to : http://www.wklken.me/posts/2015/03/03/python-base-datetime.html#datetime-string http://ww ...
- springboot注册bean失败
启动的主类应该放在和其他包一样的目录,不能放在一个目录里面
- NumPy-快速处理数据--矩阵运算
本文摘自<用Python做科学计算>,版权归原作者所有. 1. NumPy-快速处理数据--ndarray对象--数组的创建和存取 2. NumPy-快速处理数据--ndarray对象-- ...
- PHP使用RabbitMQ
基本概念 Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体,每个消息都会被投入到一个或多个队列. Bind ...
- NGINX conf 配置文件中的变量大全 可用变量列表及说明
$args #这个变量等于请求行中的参数.$content_length #请求头中的Content-length字段.$content_type #请求头中的Content-Type字段.$docu ...