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)で試験しています。