2017-09-14 1 views
0

私は竜巻ioloopと関連モジュールを読んで、ソケットが受け入れられ、要求が解析されて処理されたときに、竜巻が何をするのかを理解しています。トルネードはハンドラを処理している間にリモートクローズ接続をどのように処理するのですか?

要求接続が閉じられた後、竜巻が要求処理を停止することが可能かどうか知りたいですか?


は、私がテストハンドラを構築し、get方法は、睡眠のための5秒を費やしている(time.sleeo(5))。

私は竜巻にいくつかのリクエストを送ります。すべてのリクエストは3秒間読み取りタイムアウトに設定されていますが、竜巻に接続して数分後に接続が正常に閉じられます。

私は5秒ハンドラが竜巻のイベントループを遅くしていると思います。竜巻が2番目のハンドラを処理すると、その接続は閉じられています。竜巻がそれを知っていれば、次に行う必要はありません。

答えて

0
  1. トルネードアプリケーションではtime.sleep()を使用しないでください。その理由はthis questionを参照してください。

    ハンドラの時間がかかる部分がノンブロッキングである場合は、接続が終了するときに呼び出されるon_connection_close()メソッドを定義できます。この方法では、進行中の作業を取り消すことができます。たとえば、self.cancelled = Trueon_connection_closeに設定してキャンセルを実装する必要があります。その後、進行中の非同期作業中にこの属性を定期的にチェックしてください。

+0

ありがとうございました!もう2つの質問があります。 1.私のハンドラはブロッキングとして書かれていますが、ioloopをブロックすることはわかっています。ハンドラを実行する前に 'socket'の状態をチェックしました。空の文字列があれば、' socket'を 'MSG_PEEK'フラグで' recv'を呼び出してください。接続がリモートで閉じられていると思います、EAGAINまたはEWOULDBLOCK例外接続は生きている、これは私のために正しい? 2.私はすべての接続の受け入れ時間をログに記録したい、私は 'accept_handler'でログを追加するが、私はすべてのログ出力を1つずつ見つける、私は彼らが同時に表示されるべきだと思う。 – dawncold

+0

MSG_PEEKトリックは、一度に1つの接続にしか対応していないのであればうまくいくかもしれませんが、閉鎖された接続が検出されるまで*長い時間がかかります。私はあなたの2番目の質問を理解していません(そして、新しい質問をコメントの代わりに新しい質問として尋ねる方が良いです)。 –

関連する問題