Python で TCPServer/socket.accept を使う場合の注意

PythonWindows で使っているとどうも、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 以外のシェルを使っているとシェルごと落ちるけど