开发者

tornado IOError "Stream is closed" on request finish()

开发者 https://www.devze.com 2023-03-20 04:12 出处:网络
I\'m using tornado 2.0 and occassionally when I call self.finish() to end an asynchronous request, I\'ll get an IOError with the message \"Stream is closed\".It looks as though this happens when the c

I'm using tornado 2.0 and occassionally when I call self.finish() to end an asynchronous request, I'll get an IOError with the message "Stream is closed". It looks as though this happens when the client ends a request (ie by navigating to another page) prior to the server calling finish(). Is this expected behavior and something my code just needs to handle? I found this bug from a year ago that suggests this is NOT something client code should be handling: https://github.com/facebook/tornado/issues/81. Is this indicative of a bug in my code, and if so, what are the likely causes?

Stacktrace:

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/tor开发者_如何学运维nado/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() is called to end the asynchronous request, and some functions like self.render() will call self.finish().

If you call self.finish() after the connection is closed, it will cause the error.

so you can check if you call some functions that finish the connection before self.finish()

or you can do like this:

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

精彩评论

暂无评论...
验证码 换一张
取 消