ThreadingMixinなSocketServerの最大数

Python mini Hack-a-son ではプレゼンの方向性が違うような気がしたのでここで。

http://www.python.jp/doc/nightly/library/socketserver.html

にある通りのサンプルで、スレッドを使用したsocket通信のサーバは簡単にできてしまうんですが、調子に乗ってスレッドを作っていくと上限がないので破綻します。Forkするほうは何故か上限値が設定されています。なので、スレッドの方にも同じように上限値を設定します。

#!/bin/env python
# -*- coding: utf-8 -*-
#
import sys
import SocketServer
import threading

class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    def __init__(self, server_address, RequestHandlerClass, event_mapping=None):
        if not issubclass(RequestHandlerClass, Handler):
            raise TypeError
        SocketServer.TCPServer.__init__(self,
                                        server_address,
                                        RequestHandlerClass)
        self.max_children = threading.Semaphore(5)
        self.event_mapping = event_mapping
        self.reload = True

    def process_request(self, request, client_address):
        """Start a new thread to process the request."""
        self.max_children.acquire()
        t = threading.Thread(target = self.process_request_thread,
                             args = (request, client_address))
        if self.daemon_threads:
            t.setDaemon (1)
        t.start()

    def finish_request(self, request, client_address):
        """Finish one request by instantiating RequestHandlerClass."""
        if self.reload:
            m = reload(sys.modules[self.RequestHandlerClass.__module__])
            self.RequestHandlerClass = \
                getattr(m,
                        self.RequestHandlerClass.__name__)
        self.RequestHandlerClass(request, client_address, self)

class Handler(SocketServer.BaseRequestHandler):
    def __del__(self):
        self.server.max_children.release()

あと、こういうのってハンドラを修正するたびに再起動ってしたくないと思うので reloadするようにしてみました。毎回w

「それじゃ駄目なんだよ」というのがあったら誰か教えてください。CentOS 5.6(Python 2.4.3)で試験しています。