# HG changeset patch # User Eugen Sawin # Date 1276396443 -7200 # Node ID b887ce19c300c82faf3061e47deb76d50f38325c # Parent 0ebb73fd094aa4e27075fb0b6eff0d7b33c9253e Added worker. diff -r 0ebb73fd094a -r b887ce19c300 algorithm.py --- a/algorithm.py Sun Jun 13 01:53:58 2010 +0200 +++ b/algorithm.py Sun Jun 13 04:34:03 2010 +0200 @@ -50,8 +50,6 @@ for y in xrange(self.resolution[1]): for x in xrange(self.resolution[0]): c = self.range[0] + c_diff * complex(x, y) - #print c - #print self.test(c, max_iter) - + self.test(c, max_iter) diff -r 0ebb73fd094a -r b887ce19c300 com.py --- a/com.py Sun Jun 13 01:53:58 2010 +0200 +++ b/com.py Sun Jun 13 04:34:03 2010 +0200 @@ -3,28 +3,27 @@ commands = {} -def help(socket, client): +def help(socket, client, worker): socket.sendto("\n".join([key + ": " + value[1] for key, value in commands.iteritems()]) + "\n", client) -def createModel(socket, client, (name,)): +def createModel(socket, client, worker, (name,)): model.createModel(name) socket.sendto("model %s created\n" % name, client) -def deleteModel(socket, client, (name,)): +def deleteModel(socket, client, worker, (name,)): if model.deleteModel(name): socket.sendto("model %s deleted\n" % name, client) -def saveModel(socket, client, (name,)): +def saveModel(socket, client, worker, (name,)): model = lookupModel(socket, client, name) if model: pickle.dump(model, open(name, "w")) socket.sendto("model %s saved\n" % name, client) -def loadModel(socket, client, (name,)): +def loadModel(socket, client, worker, (name,)): model.addModel(pickle.load(open(name, "r"))) - socket.sendto("model %s loaded\n" % name, client) - + socket.sendto("model %s loaded\n" % name, client) def lookupModel(socket, client, name): if name not in model.models: @@ -33,31 +32,36 @@ else: return model.models[name] -def addObserver(socket, client, (modelName, eventType)): +def addObserver(socket, client, worker, (modelName, eventType)): model = lookupModel(socket, client, modelName) if model: model.register(socket, client, eventType) socket.sendto("observer for event type %s added: " % eventType + str(client) + "\n", client) -def setResolution(socket, client, (modelName, x, y)): +def setResolution(socket, client, worker, (modelName, x, y)): model = lookupModel(socket, client, modelName) if model: model.setResolution(int(x), int(y)) socket.sendto("model %s resolution set to %s, %s\n" % (modelName, x, y), client) -def setRange(socket, client, (modelName, begin, end)): +def setRange(socket, client, worker, (modelName, begin, end)): model = lookupModel(socket, client, modelName) if model: model.setRange(complex(begin), complex(end)) socket.sendto("model %s range set to %s, %s\n" % (modelName, begin, end), client) -def update(socket, client, (modelName, iterations)): +def update(socket, client, worker, (modelName, iterations)): model = lookupModel(socket, client, modelName) if model: - model.update(int(iterations)) + for w in worker: + dump = pickle.dumps(model) + print w + socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)), + w) + #model.update(int(iterations)) socket.sendto("model %s updated with max %s iterations\n" % (modelName, iterations), client) diff -r 0ebb73fd094a -r b887ce19c300 server.py --- a/server.py Sun Jun 13 01:53:58 2010 +0200 +++ b/server.py Sun Jun 13 04:34:03 2010 +0200 @@ -1,7 +1,9 @@ #!/usr/bin/python import com +import worker import optparse +import subprocess import SocketServer option_list = [ @@ -20,26 +22,39 @@ if key in data: args = data.partition(key)[2].split() if args: - value[0](socket, self.client_address, args) + value[0](socket, self.client_address, self.worker, args) else: - value[0](socket, self.client_address) + value[0](socket, self.client_address, self.worker) class Server(SocketServer.UDPServer): - def __init__(self, host, port, handler, options): + def __init__(self, host, port, handler, options, worker): SocketServer.UDPServer.__init__(self, (host, port), handler) self.host = host self.port = port self.handler = handler self.options = options + self.handler.worker = worker def run(self): self.serve_forever() - + +def spawnWorker(server, n): + port = server[1] + 1 + worker_list = [] + for i in xrange(n): + #worker.spawn(server[0], port + i) + subprocess.Popen(["python worker.py", str(port + i)], shell=True) + worker_list.append((server[0], port + i)) + return worker_list + if __name__ == "__main__": - parser = optparse.OptionParser(usage="usage: %prog [options] port", + parser = optparse.OptionParser(usage="usage: %prog [options] port worker", option_list=option_list) options, args = parser.parse_args() if len(args) > 0: + host = "localhost" port = int(args[0]) - server = Server("localhost", port, Handler, options) + worker_count = int(args[1]) + worker = spawnWorker((host, port), worker_count) + server = Server(host, port, Handler, options, worker) server.run() diff -r 0ebb73fd094a -r b887ce19c300 worker.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/worker.py Sun Jun 13 04:34:03 2010 +0200 @@ -0,0 +1,48 @@ +#!/usr/bin/python + +import com +import model +import optparse +import pickle +import SocketServer + +option_list = [ + optparse.make_option("-q", "--quiet", action="store_true", dest="quiet", + help="quiet mode", default=False)] + +def spawn(host, port): + return Worker(host, port, Handler, ()) + +class Handler(SocketServer.BaseRequestHandler): + """ + """ + def handle(self): + data = self.request[0].strip() + socket = self.request[1] + print "%s wrote:" % self.client_address[0] + model_size = int(data[:10]) + model = pickle.loads(data[10:10+model_size]) + max_iter = int(data[10+model_size:20+model_size]) + model.update(max_iter) + socket.sendto("finished\n", self.client_address) + +class Worker(SocketServer.UDPServer): + def __init__(self, host, port, handler, options): + SocketServer.UDPServer.__init__(self, (host, port), handler) + self.host = host + self.port = port + self.handler = handler + self.options = options + def run(self): + print "worker running at port %s" % self.port + self.serve_forever() + +if __name__ == "__main__": + parser = optparse.OptionParser(usage="usage: %prog [options] port", + option_list=option_list) + options, args = parser.parse_args() + + if len(args) > 0: + port = int(args[0]) + worker = Worker("localhost", port, Handler, options) + worker.run()