0

課題のためにPythonでチャットサーバーを書いています。ただし、サーバーのシャットダウンで問題が発生します。何が起こっているのか:

クライアントが接続すると、2つのスレッドが生成されます:readThreadwriteThread。クライアントからのデータの読み取りとへのreadThread印刷を担当し、クライアントからのメッセージの読み取りとクライアントへの送信を担当します。stdoutwriteThreadstdin

クライアントが送信'EXIT'したら、サーバーをシャットダウンしたいと思います。私writeThreadは次のようなループで実行されます:

def write(self) :
        while self.dowrite :
            data = sys.stdin.readline().strip();            
            self.conn.send(data);
        print 'WriteThread loop ended';

さて、を受け取ったときはfalseEXITに設定dowriteしましたが、もちろん、呼び出しがブロックされているため、whileループは中断されませんsys.stdin.readline().strip()

つまり、切断するには、クライアントがを送信するEXIT必要があり、次にコンソールでReturnキーを押す必要があります。これを回避する方法はありますか?クライアントが終了メッセージを送信すると、すぐにwhileループから抜け出しますwrite()

編集 それがどのように一緒になるか:

メインスレッドは2つのスレッド:readとを生成し、終了するwriteのを待ちます(結合します)readReadを読み取ると終了しますEXIT。スレッドが終了するとすぐにread、メインスレッドは続行dowriteし、書き込みスレッドでfalseに設定されます。これにより、書き込みループが終了しますが、これは、whileループがもう一度繰り返される場合にのみ発生します。

4

1 に答える 1

1

子スレッドをデーモンにします。

t.daemon = True

プログラムが終了すると、デーモンスレッドは停止します。

イベントを使用して、他のスレッドにそのことを通知できます。イベントが発生したスレッド:

event.set() # event occurred

他のスレッド:

event.wait() # wait for event
于 2012-08-20T00:45:08.733 に答える