tornado版本及多线程情况梳理
来源:互联网 发布:人工智能计算器电脑版 编辑:程序博客网 时间:2024/06/06 03:47
- python2.6 tornado-4.2-py26环境
import tornado.ioloopimport tornado.webfrom tornado.web import asynchronousfrom concurrent import futures executor = futures.ThreadPoolExecutor(max_workers=2)def call(handler): handler.write("Hello, World!") handler.finish() # 如果不写这行则回挂住class MainHandler(tornado.web.RequestHandler): @asynchronous def get(self): executor.submit(call, self)def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(9090) tornado.ioloop.IOLoop.current().start()~
如果get/post返回future/gen(异步, yield的生成器), 则需申明asynchronous, 不然该future不会加入IOLoop的事件, 直接处理完成, 如果在线程/协程中再有finish调用, 则会出现finish() called twice, 下面会详细说到。反过来说如果申明是asynchronous, 必需返回future 或者 gen- finish() call twice 示例代码:需注意线程抛的异常,主线程是catch不到的
import tornado.ioloopimport tornado.webfrom tornado.web import asynchronousfrom concurrent import futures executor = futures.ThreadPoolExecutor(max_workers=2)import timeimport tracebackdef call(handler): try: print id(handler) handler.write("Hello, World! id: %s" % id(handler)) time.sleep(5) handler.finish() print "over.id[%s]" % id(handler) except: print traceback.format_exc()class MainHandler(tornado.web.RequestHandler): #@asynchronous def get(self): executor.submit(call, self)def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(9090) tornado.ioloop.IOLoop.current().start()
- 另外注意如果使用tornado.ioloop.IOLoop.instance().add_callback(lambda: handler.finish({"xx": "yy"})) 返回值最好是字符串, 编码如果出现问题,则用户不会调用到finish,源码如下:
def write(self, chunk): if self._finished: raise RuntimeError("Cannot write() after finish()") if not isinstance(chunk, (bytes, unicode_type, dict)): message = "write() only accepts bytes, unicode, and dict objects" if isinstance(chunk, list): message += ". Lists not accepted for security reasons; see http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write" raise TypeError(message) if isinstance(chunk, dict): chunk = escape.json_encode(chunk) # 这里会报 'utf8' codec can't decode bytes self.set_header("Content-Type", "application/json; charset=UTF-8") chunk = utf8(chunk) self._write_buffer.append(chunk)
阅读全文
0 0
- tornado版本及多线程情况梳理
- tornado 多线程服务器配置
- WDF 驱动版本及系统支持情况
- ruby 多线程及查看程序运行情况
- Tornado介绍及示例
- Java 多线程核心技术梳理
- 多线程相关知识梳理
- C#梳理【多线程Thread】
- java 多线程梳理
- Tornado 上传文件及存储
- Tornado 上传文件及存储
- Tornado(一) 安装及Demo
- 总结及梳理 : Fragment
- tomcat多版本共存梳理
- cocos2dx版本热更新梳理
- JAVA多线程梳理(一)
- C#多线程(-) -- 概念梳理
- JAVA多线程、高并发梳理
- PHP中self和this的用法区别
- 流媒体开发的有用网址收藏
- =="和Equals的区别
- Java异常机制
- Linux下安装Zookeeper
- tornado版本及多线程情况梳理
- VOC2007数据集下载
- python检测空间储存剩余大小和指定文件夹内存占用
- oracle事务总结
- java判断空字符串和对象是否为null
- 当layer层遇到form表单提交
- Python中的路径问题
- Ubuntu MATE 一些疑难杂症的解决方法
- List、Set、Map常用方法