торнадо IOError "Поток закрыт" по запросу finish () - PullRequest
4 голосов
/ 14 июля 2011

Я использую торнадо 2.0, и иногда, когда я вызываю self.finish () для завершения асинхронного запроса, я получаю IOError с сообщением «Поток закрыт». Похоже, это происходит, когда клиент завершает запрос (т. Е. Путем перехода на другую страницу) до того, как сервер вызовет finish (). Это ожидаемое поведение и что-то, что мой код просто должен обработать? Я обнаружил эту ошибку год назад, которая предполагает, что это НЕ то, что должен обрабатывать клиентский код: https://github.com/facebook/tornado/issues/81. Указывает ли это на ошибку в моем коде, и если да, то каковы вероятные причины?

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/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 голосов
/ 14 июля 2011

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
...