ネットワーク通信用のソケットについて学ぶときに問題があります。私は接続を聞き、クライアント接続のためのプロセスを作成する単純なスレッドを作ったが、私の問題はsocket.accept()を取り消す方法を見つけられなかったのでスレッドを正しく結合できないことであるいつ私がプログラムを終了したい。ファイアウォールスレッドのリスニングソケットを閉じる
私のコードは次のようになります。
class ServerThread(threading.Thread):
def __init__(self, queue, host, port):
threading.Thread.__init__(self)
self.queue = queue
self.running = True
self.hostname = host
self.port = port
def run(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((self.hostname, self.port))
self.socket.listen(1)
while self.running:
try:
conn, address = self.socket.accept()
process = Process(target=server_slave, args=(conn, address, self.queue))
process.daemon = True
process.start()
except socket.timeout:
pass
def stop(self):
self.running = False
self.socket.close()
私はself.setDaemon(True)
を設定し、ちょうど偉大なガベージコレクタにすべてを手渡し、メインプログラムを終了することで閉じるようにプログラムを得るために管理している - それは悪い解決策のように思えます。私もソケットのタイムアウトを設定しようとしましたが、その結果は[Errno 35] Resource temporarily unavailable
になります(実際のタイムアウトに関係なく、何年に設定しても...)。
私は間違っていますか?私はスレッドを愚かな方法で設計したのですか、接続を受け入れることについて何か忘れたことがありますか?
後
conn.settimeout(None)
を入れて 'それは悪い解決策のように思える' - それは動作しますか? OSがすべてのスレッドを終了させるのが気に入らなければ、メインスレッドまたは他のスレッドからリスニングソケットを閉じることができます。これは通常、accept()がエラーを伴って 'early'を返すようにします。ほとんどのOS /言語で動作しますが、Pythonで試したわけではありませんので、答えはありません。 –これは機能しますが、私は潜在的なクライアントをそれほどうまく扱っていないかもしれないと感じています。コードを完成させるためにはより良いソリューションを投稿しましたが、すぐに参加しなければならない新しいプロセスを作成することで終わってしまったので、少し奇妙に見えます。 – Norling