`
sls0919
  • 浏览: 125852 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tornado中finish和write区别

阅读更多

直接上代码:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.finish("haha")
        self.write("Hello, world")

class TesHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('hello, world!')
        self.finish("hehe")

application = tornado.web.Application([
            (r"/", MainHandler),
            (r'/test',TesHandler),
        ])


if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start() 

 执行结果:

执行第一个请求:haha

执行第二个请求:hello, world!hehe

后台在执行第一个请求时报错,但是不影响程序运行,也不影响前端显示,执行第二个请求影响前段显示。

下面是第一个请求报错信息:

ERROR:root:Uncaught exception GET / (127.0.0.1)
HTTPRequest(protocol='http', host='127.0.0.1:8888', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1', body='', headers={'Accept-Language': 'zh-CN,zh;q=0.8', 'Accept-Encoding': 'gzip,deflate,sdch', 'Host': '127.0.0.1:8888', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.52 Chrome/28.0.1500.52 Safari/537.36', 'Connection': 'keep-alive', 'Cookie': '_xsrf=a9c654af7afb46cd87475974ded7fa6b', 'If-None-Match': '"637d1f5c6e6d1be22ed907eb3d223d858ca396d8"'})
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1042, in _execute
    getattr(self, self.request.method.lower())(*args, **kwargs)
  File "test_write.py", line 7, in get
    self.write("Hello, world")
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 489, in write
    raise RuntimeError("Cannot write() after finish().  May be caused "
RuntimeError: Cannot write() after finish().  May be caused by using async operations without the @asynchronous decorator.

 分析

        当一个处理请求的行为被执行之后,这个请求会自动地结束。因为 Tornado 当中使用了 一种非阻塞式的 I/O 模型,所以你可以改变这种默认的处理行为——让一个请求一直保持 连接状态,而不是马上返回,直到一个主处理行为返回。要实现这种处理方式,只需要 使用 tornado.web.asynchronous 装饰器就可以了。

 

使用了这个装饰器之后,你必须调用 self.finish() 已完成 HTTTP 请求,否则 用户的浏览器会一直处于等待服务器响应的状态。

下面(参考http://simple-is-better.com/news/627):

@安江泽

    self.finish()代表回应生成的终结,并不代表着请求处理逻辑的终结。假设你有一个block的逻辑是和回应无关的,那么放在self.finish()的后面可以显著的缩短响应时间。所以,如果你确定自己的逻辑需要立即返回,可以在self.finish()后立刻return。Tornado在将这个自由留给了你自己。

另外一个理由是,在call stack里让顶端的函数去弹出一个非顶端的函数,这个逻辑有点奇怪。唯一能够提供退出的机制就是异常了。但是在正常逻辑里面使用异常去实现一个功能,也是很怪的逻辑。

@杨昆
没错  同理还有self.render/self.write
我们在所有这种response语句前加return 例如  return self.redirect(‘/’)

至此,这个问题得到了完美的解决和解答,而我想后者才是更重要的。

 

0
1
分享到:
评论

相关推荐

    tornado中文文档

    tornado 官方文档中文翻译版本,epub格式,可在kindle,掌阅等平台观看。

    Tornado中文培训教程

    此外,GNU工具链如GCC和C++编译器也自动集成于Tornado目录树中。 综上所述,Tornado中文培训教程详细介绍了Tornado开发环境的各个方面,从其核心组件、开发工具、配置选项到实时系统特性和交叉开发流程,为学习者...

    Python Tornado 中文教程

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 ...

    Tornado教程.pdf

    Tornado 在实时 Web 应用中的优势在于对长轮询和 WebSockets 的支持。长轮询是一种模拟实时推送的技术,服务器在客户端请求没有关闭时保持连接,直到有新数据才返回。WebSockets 则提供双向通信通道,一旦建立连接,...

    tornado中文

    Tornado 的设计初衷是解决 C10K 问题,即在一个单一进程内高效地处理成千上万个并发连接,这在传统的基于线程的 Web 服务器(如 Apache)中是非常困难的。 #### 二、Tornado 的优势与应用场景 ##### 2.1 高性能与...

    Tornado使用指南(中文版)

    **Tornado框架详解** Tornado是一款高性能、异步网络库,最初由FriendFeed开发,后被Facebook收购并开源。它以其非阻塞I/O模型和Web服务器...在实际项目中,结合最佳实践和持续学习,Tornado将成为你强大的工具箱。

    Tornado 2.2 入门介绍 中文

    Tornado 以其非阻塞 I/O 和高并发性能而著称,尤其适合实时Web应用和长连接服务,如聊天、推送通知、实时数据分析等场景。 **1. Tornado 的核心特性** - **非阻塞 I/O**: Tornado 使用了基于事件的异步模型,使得...

    tornado 4.0.1 python framework guide

    这种设计模式允许 Tornado 在单个线程中同时处理成千上万个并发连接,极大地提高了服务器的响应速度和吞吐量。 **1.3 协程(Coroutines)** 协程是 Tornado 中处理异步任务的主要方式之一。通过使用装饰器 `@gen....

    Tornado上传和下载文件(以CSV文件为例).7z

    在Python的Web开发框架中,Tornado是一个轻量级且高性能的选择,尤其在处理异步I/O和长连接方面表现出色。本主题将探讨如何在Tornado中实现文件的上传和下载功能,以CSV文件为例。我们将从以下几个方面展开讨论: 1...

    Tornado实战Demo全集

    在IT行业中,Python是一种广泛应用的编程语言,而Tornado是一个基于Python的Web服务器框架和异步网络库。这个“Tornado实战Demo全集”显然是一份面向初学者的资源,旨在帮助他们深入理解和掌握Tornado框架,特别是其...

    tornado官方翻译文档

    Tornado官方翻译文档是关于Tornado这个Python Web框架和异步网络库的使用手册。Tornado是为了解决高并发和长连接问题而设计的,它使用非阻塞的网络I/O模型,从而能够承受成千上万的并发连接,特别适合于实现长轮询、...

    Tornado入门的基本程序

    Tornado是一个开源的Python Web服务器和网络库,它以其非阻塞I/O模型而闻名,特别适合处理大量的并发连接。在本文中,我们将深入探讨如何搭建Tornado环境以及如何开始使用这个强大的框架。 一、Tornado环境搭建 1....

    Introduction to tornado中文教程.epub

    Introduction to tornado中文教程,介绍tornado的中文资料,难得的好书,简单通俗,实用的手册

    python基于Tornado实现,系统核心调度,可分布式扩展

    在Python和Tornado中,可以使用如RabbitMQ、Kafka或Redis等消息队列作为中介,将任务发布到队列中,然后由分布在不同机器上的工作进程消费。这些工作进程可以是运行相同Tornado应用的实例,它们从队列中获取任务,...

    tornado入门大全

    5. **轻量级**:Tornado的设计哲学是简单和轻量,这使得它容易理解和调试,同时也方便与其他Python库集成。 ### 二、安装Tornado 在Python环境中,可以通过pip来安装Tornado: ```bash pip install tornado ``` ...

    用Tornado开发RESTful-API运用

    下面的示例展示了如何在Tornado中处理JSON和JSONP: ```python import tornado.escape class APIHandler(BaseHandler): def finish(self, chunk=None, notification=None): if chunk is None: chunk = {} if ...

    tornado 简单项目结构

    本项目结构针对的是一个基础的 Tornado 应用,旨在帮助初学者理解如何组织 Tornado 项目的文件和目录。下面将详细介绍这个简单项目结构中的关键组成部分。 1. **主程序文件 (main.py)**:通常在 Tornado 项目中,`...

Global site tag (gtag.js) - Google Analytics