2011-09-08 21 views
7

質問:pythonのsocket.accept()関数に何らかのタイムアウトや割り込みがありますか?pythonソケットオブジェクトがタイムアウトを受け入れる


情報:

私は受け入れ、傾向とメインスレッドのキューに渡す常にポートにバインドされ、子スレッドを持つプログラムを持っています。今私は子スレッドに割り込みを与えて、適切に解体できるようにしようとしています。子スレッドを単に停止して親プロセスに子プロセスを解体させることは可能ですが、早期受諾フォームを返すことができる他の時間があるので、私はそれが最も有用なアプローチになると判断しました。

したがって、タイムアウトを取るか、acceptメソッドをキャンセルして、スレッドが何かを最初に接続している状態でw/oを返せるようにする方法はありますか?

答えて

8

あなたは私の知る限り、これはすべてソケット操作に影響を与えます

import socket 
print socket.getdefaulttimeout() 
socket.setdefaulttimeout(60) 

+0

? OK。私はドキュメントを読むと、そのように聞こえるようになり、sendとrecvだけが影響を受けました。ありがとう! – Narcolapser

6

多分settimeout()はあなたが探しているものです。

2

をデフォルトのタイムアウトを設定することができますが、この例のようにsettimeout()を使用することができます。

import socket 

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
tcpServer.bind(('0.0.0.0', 10000)) # IP and PORT 

stopped = False 
while not stopped: 
    try: 
    tcpServer.settimeout(0.2) # timeout for listening 
    tcpServer.listen(1) 
    (conn, (ip, port)) = tcpServer.accept() 
    except socket.timeout: 
    pass 
    except: 
    raise 
    else: 
    # work with the connection, create a thread etc. 
    ... 

ループstoppedがtrueに設定され、設定したタイムアウト後に(最大で)終了するまで実行されます。 (私のアプリケーションでは、新たに作成されたスレッドに接続ハンドルを渡して、さらに同時接続を受け入れるためにループを続行します)。

関連する問題