最后挡在龙卷风发电机发动机不工作

2024-06-16 10:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设(使用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()

但此代码无法按预期工作,例如,使用这个简单的客户端:

^{pr2}$

服务器输出:

( 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和{}都没有打印。在

怎么了?!在

更新:

我注意到,如果我为handler实现on_connection_close,将调用on_connection_close回调,并且不会在控制台中打印错误。但是这个函数有什么魔力呢?(我已经在RequestHandler上定义了空体)。在

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


Tags: toinfromselfwebreadonerror
1条回答
网友
1楼 · 发布于 2024-06-16 10:17:51

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

相关问题 更多 >