1

私は次のコードを持っています:

s.settimeout( 300 )
while notend:
   data = s.recv()       
   datacheck()
   ...

上記のコードはスレッド上で実行されているため、ユーザーがnotend変数をFalseに設定すると、スレッドは終了します。ただし、この場合、すぐには終了しませんrecv。関数のため、終了するのに300秒かかります。このスレッドを終了するにはどうすればよいですか?

# Wait all the threads
for thread in threading.enumerate():
   if thread is not threading.currentThread():
       thread.join()
4

3 に答える 3

2

問題は、ブロックしているソケットがある場合recv()、タイムアウトの間ずっとブロックされることです。より短いタイムアウトを指定することもできますが、それはやりたいことではないかもしれません (ping が実際に数千ミリ秒の場合はどうなるでしょうか?)。

単純にrecv()終日試行する代わりに、select.pollオブジェクトを使用して対象のソケットをより頻繁に (タイムアウトを短く)recv()ポーリングし、ポーリングで読み取るデータがあると報告された場合にのみ呼び出すことができます。notendポーリングの合間に、現在 falseであることが判明した場合、ポーリング ループから抜け出すことができます。

プラットフォームが をサポートしていない場合はpoll()、サポートしているかどうかを確認してくださいselect()。次に、select.select()関数を使用して、ほぼ同じタスクを実行できます。

説明されている機能のリファレンスは次のとおりです。

http://docs.python.org/2/library/select.html#poll-objects http://docs.python.org/2/library/select.html#select.select

于 2013-02-20T09:56:42.460 に答える
1

簡単な答え - 別のスレッドから s を閉じます。その後、recv() 呼び出しはエラーを返し、それを呼び出したスレッドがクリーンアップして終了できるようにします。

タイムアウト、select() などは必要ありません。

于 2013-02-20T10:35:03.743 に答える
0

ブロッキングメソッドであるため、 socket.settimeoutを利用してくださいrecv

于 2013-02-20T09:44:14.530 に答える