Tornado Non-blocking Process
来源:互联网 发布:卫星免费网络电视直播 编辑:程序博客网 时间:2024/05/21 06:45
分享一个tornado的non-blocking process方法。
从 tornado-async-process-mixin.py 升级而来,解决了产生僵尸进程的问题,并增加了错误输出的抓取。
使用方法见代码中的示例即可:
class BaseRequestHandler(tornado.web.RequestHandler):
'''An non-blocking process
Example usage:
class MainHandler(srmlib.BaseRequestHandler):
@tornado.web.asynchronous
def get(self):
self.call_subprocess('sleep 5; cat /var/run/syslog.pid', self.async_callback(self.on_response))
def on_response(self, output):
self.write(output)
self.finish()
call_subprocess() can take a string command line.
'''
def call_subprocess(self, command, callback=None, io_loop=None, **kargs):
self.callback = callback
self.io_loop = io_loop or tornado.ioloop.IOLoop.instance()
self.process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kargs)
self.pipe = self.process.stdout
self.io_loop.add_handler(self.pipe.fileno(), self._handle_events, self.io_loop.READ)
def _handle_events(self, fd, events):
# Called by IOLoop when there is activity on the pipe output.
if self.process.poll() is not None:
self.io_loop.remove_handler(fd)
output = ''.join(self.pipe)
self.callback(output)
'''An non-blocking process
Example usage:
class MainHandler(srmlib.BaseRequestHandler):
@tornado.web.asynchronous
def get(self):
self.call_subprocess('sleep 5; cat /var/run/syslog.pid', self.async_callback(self.on_response))
def on_response(self, output):
self.write(output)
self.finish()
call_subprocess() can take a string command line.
'''
def call_subprocess(self, command, callback=None, io_loop=None, **kargs):
self.callback = callback
self.io_loop = io_loop or tornado.ioloop.IOLoop.instance()
self.process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kargs)
self.pipe = self.process.stdout
self.io_loop.add_handler(self.pipe.fileno(), self._handle_events, self.io_loop.READ)
def _handle_events(self, fd, events):
# Called by IOLoop when there is activity on the pipe output.
if self.process.poll() is not None:
self.io_loop.remove_handler(fd)
output = ''.join(self.pipe)
self.callback(output)
- Tornado Non-blocking Process
- Blocking vs. Non-Blocking Sockets
- non-blocking and blocking mode
- Blocking vs. non-blocking sockets
- Callback,Non-Blocking,Blocking函数
- Non-Blocking Web-Request
- P2P non-blocking
- 关于non-blocking
- Non-Blocking Channel Operations
- asynchronous vs non-blocking
- PNP: non-blocking IO
- Synchronous/Asynchronous/Blocking/Non-blocking I/O
- 2.5. Non-blocking logging daemon
- Non-blocking Web Service Client
- Non-blocking BSD socket connections
- Java NIO: Non-blocking Server
- Java NIO: Non-blocking Server
- Non blocking IO web server
- JNI(4) JNI Functions
- 弹性动画~~~~ EasingFunction
- Hibernate正向工程hbm2ddl
- 高精度整数的四则运算
- JFreeChart sturt2
- Tornado Non-blocking Process
- (转)Cocos2d-x学习之 整体框架描述
- Struts2 验证码图片生成实例
- C++ typeof基本应用方式解析
- MFC 多线程(转)
- hdu 1133
- RCP 启动时提示缺少插件,问题解决方法
- python小技巧 全排列的实现和join函数
- HDFS小文件问题及解决方案