Skip to main content
 首页 » 编程设计

python之最后阻止 Tornado 生成引擎不起作用

2025年05月04日12kenshinobiy

假设,(使用 Tornado )有人想将大数据传输到慢速客户端,并打印传输的数据量。我为此编写了这个简单的代码:

from tornado import web, ioloop, gen 
 
class MainHandler(web.RequestHandler): 
    @web.asynchronous 
    @gen.engine 
    def get(self): 
        print '( start' 
        try: 
            for i in xrange(100): 
                self.write('*' * 100000)  # write ~100KB of data 
                yield gen.Task(self.flush)  # wait for reciever to recieve 
                print '- wrote', i 
        finally: 
            print '| finally' 
            self.finish() 
        print ') finish' 
 
application = web.Application([ 
    (r"/", MainHandler), 
    ]) 
 
application.listen(8888) 
ioloop.IOLoop.instance().start() 

但是这段代码没有按预期工作,例如使用这个简单的客户端:

req = urlopen('http://127.0.0.1:8888/') 
sys.exit()  # exit without reading response 

服务器输出:

( start 
- wrote 0 
- wrote 1 
- wrote 2 
WARNING:root:Read error on 7: [Errno 104] Connection reset by peer 
WARNING:root:error on read 
Traceback (most recent call last): 
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.4.1-py2.7.egg/tornado/iostream.py", line 361, in _handle_read 
    if self._read_to_buffer() == 0: 
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.4.1-py2.7.egg/tornado/iostream.py", line 428, in _read_to_buffer 
    chunk = self._read_from_socket() 
  File "/usr/local/lib/python2.7/dist-packages/tornado-2.4.1-py2.7.egg/tornado/iostream.py", line 409, in _read_from_socket 
    chunk = self.socket.recv(self.read_chunk_size) 
error: [Errno 104] Connection reset by peer 

但是 finally 和 finish 都没有被打印出来。

有什么问题?!

更新:

我注意到,如果我为处理程序实现 on_connection_close,将调用 on_connection_close 回调,并且不会在控制台中打印任何错误。但是这个功能有什么神奇之处呢? (我已经在 RequestHandler 上定义了空体)。

更重要的答案:为什么我的生成器没有closed?这是垃圾收集还是不收集? PEP-342 说 finally block 应该在任何情况下执行。

请您参考如下方法:

带有 finally 子句的生成器在 Python 版本 <= 3.3 中使用 __del__ 实现,并且具有其他析构函数的所有限制 - 它们不能保证在以下情况下立即执行在存在引用循环的情况下。在 Python 3.4 中,这得到了改进 ( http://www.python.org/dev/peps/pep-0442/ ) 并且生成器的 finally 子句运行得更加可靠。