class Server(Resource): # the server itself is a resource because # it could have it's own methods def __init__(self,proto="tcp",host="*",port="5555"): self.address = "%s://%s:%s" % (proto,host,port) self.up = False self.socket = None #self.resource_map = {} self.mapper = ObjectMapper() self.return_data = True self.router = Router(self) #self.gson = Gson() def handle_request(self,request): # you may want to add server methods someday return self.not_found(request) def shutdown(self): self.stop() # # Resource-specific methods # def get_resource_map(self): # TODO: traverse resources and build map pass def add_resource(self,name,resource): self.router.add(name,resource) def get_resource(self,name): return self.router.get(name) def start(self): print "Starting Lightsocket..." context = ZMQ.context(4) # number of IO threads to use self.socket = context.socket(ZMQ.REP) self.socket.bind(self.address) self.up = True self.receive_requests() def receive_requests(self): print "Ready to receive requests..." while self.up: raw = self.socket.recv(0) # max req/sec with one python client: 10174 req/sec # python client json serialization drops 10174 to 8153 # jython server json read drops it from 8153 to 6302 request = Request(self.mapper.readValue(raw.tostring(),HashMap)) # router drops is from 6302 to 4600 (this is the only thing to optimize) resp = self.router.get(request) # re-serialization drops it from 4600 to 4282 (you don't have to serialize) self.send_response(resp) #self.socket.send(str(dict()), 0) # evidently pickle with zlib is not faster than json #decomp = zlib.decompress(raw) #data = cPickle.loads(decomp) #request = Request(data) def send_response(self,resp): self.socket.send(resp.to_json(self.return_data), 0) #self.socket.send("OK", 0) def stop(self): self.up = False for resource in self.resource_map.values(): resource.shutdown()