2011-07-14 15 views
4

私は竜巻2.0を使用していますが、非同期要求を終了するためにself.finish()を呼び出すと、時折、IOErrorメッセージが表示されます。 "これは、サーバーがfinish()を呼び出す前にクライアントが要求を終了したとき(つまり、別のページにナビゲートすることによって)に起こるかのように見えます。これは期待された動作で、私のコードだけで処理する必要がありますか?私は1年前にこのバグを見つけました。これは、クライアントコードが何か処理されるべきではないことを示唆しています:https://github.com/facebook/tornado/issues/81。これは私のコードのバグを示していますか?その場合、原因は何でしょうか?竜巻IOError要求に応じてストリームが閉じています

スタックトレース:

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

関連する問題