用途:sock.shutdown (socket.SHUT_RD)
その後accept
はEINVAL
を返します。醜いクロススレッド信号は必要ありません! Pythonドキュメントから
:「。あなたがタイムリーに接続を閉じたい場合は、close()
前shutdown()
を呼び出すclose()
リリース接続に関連付けられたリソースを注意したが、必ずしもすぐに接続を閉じていない」 C.しかし、私でのプログラミングのみ使用して信号をPythonで同じ問題に実行している、と熟考した後、今日の解決策を発見しながら、
http://docs.python.org/3/library/socket.html#socket.socket.close
は、私が(不潔!)、その後、数年前にこの問題に遭遇しましたメモをshutdown
について覚えておいてください!
スレッド間でソケットを閉じる/使用しないでください... CPythonでは、グローバルなインタプリタロックがあなたを保護するはずです(生の整数ファイル記述子ではなくファイルオブジェクトを使用していると仮定します)。ここで
は例のコードは次のとおりです。
import socket, threading, time
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind (('', 8000))
sock.listen (5)
def child():
print ('child accept ...')
try: sock.accept()
except OSError as exc : print ('child exception %s' % exc)
print ('child exit')
threading.Thread (target = child).start()
time.sleep (1)
print ('main shutdown')
sock.shutdown (socket.SHUT_RD)
time.sleep (1)
print ('main close')
sock.close()
time.sleep (1)
print ('main exit')
出典
2013-10-08 04:24:44
mpb
+1私の推測では、最後のシナリオです。スレッド1はacceptでブロックしています。スレッド2はソケットを閉じます。スレッド1は永遠にブロックします。 – Duck
これは正しいです。使用している信号用の空のシグナルハンドラをインストールしたいと思うことに注意してください。 – caf
ああ、POSIXのこの部分は本当に吸う。 – thodg