tornado IOError “流已关闭”在请求 finish() 时

4 投票
1 回答
3328 浏览
提问于 2025-04-16 21:32

我在使用tornado 2.0的时候,偶尔会遇到一个问题。当我调用self.finish()来结束一个异步请求时,系统会报一个IOError,提示“流已关闭”。看起来这个问题发生在客户端在服务器调用finish()之前就结束了请求,比如说用户切换到另一个页面。这种情况是正常的吗?我的代码需要处理这个问题吗?我发现了一年前的一个bug,建议这不是客户端代码应该处理的事情:https://github.com/facebook/tornado/issues/81。这是否说明我的代码有bug,如果有,可能是什么原因呢?

错误追踪信息:

Traceback (most recent call last):
  File "my_code.py", line 260, in my_method
    self.finish()
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 634, in finish
    self.request.finish()
  File "/usr/lib/python2.6/site-packages/tornado/httpserver.py", line 555, in finish
    self.connection.finish()
  File "/usr/lib/python2.6/site-packages/tornado/httpserver.py", line 349, in finish
    self._finish_request()
  File "/usr/lib/python2.6/site-packages/tornado/httpserver.py", line 372, in _finish_request
    self.stream.read_until(b("\r\n\r\n"), self._header_callback)
  File "/usr/lib/python2.6/site-packages/tornado/iostream.py", line 137, in read_until
    self._check_closed()
  File "/usr/lib/python2.6/site-packages/tornado/iostream.py", line 403, in _check_closed
    raise IOError("Stream is closed")
IOError: Stream is closed

1 个回答

0

self.finish() 是用来结束一个异步请求的,有些函数,比如 self.render(),会自动调用 self.finish()。

如果你在连接已经关闭后再调用 self.finish(),就会出现错误。

所以你可以检查一下,确保在调用 self.finish() 之前没有调用那些会结束连接的函数。

或者你可以这样做:

if not self._finished:
    #if the connection is closed, it won't call this function
    self.finish()
else:
    pass

撰写回答