2011-07-14 29 views
4

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

堆栈跟踪:

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 
+0

喜说笑,你有没有得到解决这个?即时通讯体验相同的事情。 –

+0

我没有。我现在只要调用self.finish就会发现IOErrors ...不知道这是否是最优的,但它会使问题消失。 – josh

回答

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 
+0

我无法重现这一点。当我尝试: self.request.connection.stream.close() self.finish() 我没有得到任何异常。 – josh

相关问题