【问题标题】:tornado IOError "Stream is closed" on request finish()龙卷风 IOError “流已关闭”请求完成()
【发布时间】:2011-10-05 13:19:10
【问题描述】:

我正在使用 tornado 2.0,有时当我调用 self.finish() 来结束异步请求时,我会收到一个 IOError 并显示消息“Stream is closed”。当客户端在服务器调用finish() 之前结束请求(即通过导航到另一个页面)时,似乎会发生这种情况。这是预期的行为和我的代码只需要处理的东西吗?我发现一年前的这个错误表明这不是客户端代码应该处理的事情:https://github.com/facebook/tornado/issues/81。这是否表明我的代码中存在错误,如果是,可能的原因是什么?

堆栈跟踪:

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

【问题讨论】:

  • 嗨乔希,你有没有解决这个问题?我正在经历同样的事情。
  • 我没有。现在,每当我调用 self.finish 时,我都会捕获 IOErrors ......不知道这是否是最佳的,但它会让问题消失。

标签: python tornado


【解决方案1】:

调用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

【讨论】:

  • 我无法重现这个。当我尝试时: self.request.connection.stream.close() self.finish() 我根本没有遇到异常。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多