Python で TCPServer/socket.accept を使う場合の注意
Python を Windows で使っているとどうも、socket.socket.accept で接続待ちしている間、Contol-C などによる割り込みはキューに入るだけで、即座に処理できないらしい*1。結果として Control-C での SIGINT が処理されてプロセスが終了するのは accept から戻ってきた直後、つまり接続があったタイミングになってすごく変。で、このへんを見ると select.select を使えとのこと。
TCPServer および、そのサブクラス(HTTPServer とか SimpleXMLRPCServer とか)も単純に accept を使っているので同じ問題が起きる。そういうときは get_request を上書きしてやればいい。
class MyXMLRPCServer(SimpleXMLRPCServer): def get_request(self): while True: r = select.select([self.socket], [], [], 1) if len(r[0]) > 0: return self.socket.accept()
*1:でも Control-Break で無理矢理終了できる。cmd.exe 以外のシェルを使っているとシェルごと落ちるけど