Added worker.
1.1 --- a/algorithm.py Sun Jun 13 01:53:58 2010 +0200
1.2 +++ b/algorithm.py Sun Jun 13 04:34:03 2010 +0200
1.3 @@ -50,8 +50,6 @@
1.4 for y in xrange(self.resolution[1]):
1.5 for x in xrange(self.resolution[0]):
1.6 c = self.range[0] + c_diff * complex(x, y)
1.7 - #print c
1.8 - #print self.test(c, max_iter)
1.9 -
1.10 + self.test(c, max_iter)
1.11
1.12
2.1 --- a/com.py Sun Jun 13 01:53:58 2010 +0200
2.2 +++ b/com.py Sun Jun 13 04:34:03 2010 +0200
2.3 @@ -3,28 +3,27 @@
2.4
2.5 commands = {}
2.6
2.7 -def help(socket, client):
2.8 +def help(socket, client, worker):
2.9 socket.sendto("\n".join([key + ": " + value[1]
2.10 for key, value in commands.iteritems()]) + "\n", client)
2.11
2.12 -def createModel(socket, client, (name,)):
2.13 +def createModel(socket, client, worker, (name,)):
2.14 model.createModel(name)
2.15 socket.sendto("model %s created\n" % name, client)
2.16
2.17 -def deleteModel(socket, client, (name,)):
2.18 +def deleteModel(socket, client, worker, (name,)):
2.19 if model.deleteModel(name):
2.20 socket.sendto("model %s deleted\n" % name, client)
2.21
2.22 -def saveModel(socket, client, (name,)):
2.23 +def saveModel(socket, client, worker, (name,)):
2.24 model = lookupModel(socket, client, name)
2.25 if model:
2.26 pickle.dump(model, open(name, "w"))
2.27 socket.sendto("model %s saved\n" % name, client)
2.28
2.29 -def loadModel(socket, client, (name,)):
2.30 +def loadModel(socket, client, worker, (name,)):
2.31 model.addModel(pickle.load(open(name, "r")))
2.32 - socket.sendto("model %s loaded\n" % name, client)
2.33 -
2.34 + socket.sendto("model %s loaded\n" % name, client)
2.35
2.36 def lookupModel(socket, client, name):
2.37 if name not in model.models:
2.38 @@ -33,31 +32,36 @@
2.39 else:
2.40 return model.models[name]
2.41
2.42 -def addObserver(socket, client, (modelName, eventType)):
2.43 +def addObserver(socket, client, worker, (modelName, eventType)):
2.44 model = lookupModel(socket, client, modelName)
2.45 if model:
2.46 model.register(socket, client, eventType)
2.47 socket.sendto("observer for event type %s added: " % eventType
2.48 + str(client) + "\n", client)
2.49
2.50 -def setResolution(socket, client, (modelName, x, y)):
2.51 +def setResolution(socket, client, worker, (modelName, x, y)):
2.52 model = lookupModel(socket, client, modelName)
2.53 if model:
2.54 model.setResolution(int(x), int(y))
2.55 socket.sendto("model %s resolution set to %s, %s\n" %
2.56 (modelName, x, y), client)
2.57
2.58 -def setRange(socket, client, (modelName, begin, end)):
2.59 +def setRange(socket, client, worker, (modelName, begin, end)):
2.60 model = lookupModel(socket, client, modelName)
2.61 if model:
2.62 model.setRange(complex(begin), complex(end))
2.63 socket.sendto("model %s range set to %s, %s\n" %
2.64 (modelName, begin, end), client)
2.65
2.66 -def update(socket, client, (modelName, iterations)):
2.67 +def update(socket, client, worker, (modelName, iterations)):
2.68 model = lookupModel(socket, client, modelName)
2.69 if model:
2.70 - model.update(int(iterations))
2.71 + for w in worker:
2.72 + dump = pickle.dumps(model)
2.73 + print w
2.74 + socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)),
2.75 + w)
2.76 + #model.update(int(iterations))
2.77 socket.sendto("model %s updated with max %s iterations\n"
2.78 % (modelName, iterations), client)
2.79
3.1 --- a/server.py Sun Jun 13 01:53:58 2010 +0200
3.2 +++ b/server.py Sun Jun 13 04:34:03 2010 +0200
3.3 @@ -1,7 +1,9 @@
3.4 #!/usr/bin/python
3.5
3.6 import com
3.7 +import worker
3.8 import optparse
3.9 +import subprocess
3.10 import SocketServer
3.11
3.12 option_list = [
3.13 @@ -20,26 +22,39 @@
3.14 if key in data:
3.15 args = data.partition(key)[2].split()
3.16 if args:
3.17 - value[0](socket, self.client_address, args)
3.18 + value[0](socket, self.client_address, self.worker, args)
3.19 else:
3.20 - value[0](socket, self.client_address)
3.21 + value[0](socket, self.client_address, self.worker)
3.22
3.23 class Server(SocketServer.UDPServer):
3.24 - def __init__(self, host, port, handler, options):
3.25 + def __init__(self, host, port, handler, options, worker):
3.26 SocketServer.UDPServer.__init__(self, (host, port), handler)
3.27 self.host = host
3.28 self.port = port
3.29 self.handler = handler
3.30 self.options = options
3.31 + self.handler.worker = worker
3.32 def run(self):
3.33 self.serve_forever()
3.34 -
3.35 +
3.36 +def spawnWorker(server, n):
3.37 + port = server[1] + 1
3.38 + worker_list = []
3.39 + for i in xrange(n):
3.40 + #worker.spawn(server[0], port + i)
3.41 + subprocess.Popen(["python worker.py", str(port + i)], shell=True)
3.42 + worker_list.append((server[0], port + i))
3.43 + return worker_list
3.44 +
3.45 if __name__ == "__main__":
3.46 - parser = optparse.OptionParser(usage="usage: %prog [options] port",
3.47 + parser = optparse.OptionParser(usage="usage: %prog [options] port worker",
3.48 option_list=option_list)
3.49 options, args = parser.parse_args()
3.50
3.51 if len(args) > 0:
3.52 + host = "localhost"
3.53 port = int(args[0])
3.54 - server = Server("localhost", port, Handler, options)
3.55 + worker_count = int(args[1])
3.56 + worker = spawnWorker((host, port), worker_count)
3.57 + server = Server(host, port, Handler, options, worker)
3.58 server.run()
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/worker.py Sun Jun 13 04:34:03 2010 +0200
4.3 @@ -0,0 +1,48 @@
4.4 +#!/usr/bin/python
4.5 +
4.6 +import com
4.7 +import model
4.8 +import optparse
4.9 +import pickle
4.10 +import SocketServer
4.11 +
4.12 +option_list = [
4.13 + optparse.make_option("-q", "--quiet", action="store_true", dest="quiet",
4.14 + help="quiet mode", default=False)]
4.15 +
4.16 +def spawn(host, port):
4.17 + return Worker(host, port, Handler, ())
4.18 +
4.19 +class Handler(SocketServer.BaseRequestHandler):
4.20 + """
4.21 + """
4.22 + def handle(self):
4.23 + data = self.request[0].strip()
4.24 + socket = self.request[1]
4.25 + print "%s wrote:" % self.client_address[0]
4.26 + model_size = int(data[:10])
4.27 + model = pickle.loads(data[10:10+model_size])
4.28 + max_iter = int(data[10+model_size:20+model_size])
4.29 + model.update(max_iter)
4.30 + socket.sendto("finished\n", self.client_address)
4.31 +
4.32 +class Worker(SocketServer.UDPServer):
4.33 + def __init__(self, host, port, handler, options):
4.34 + SocketServer.UDPServer.__init__(self, (host, port), handler)
4.35 + self.host = host
4.36 + self.port = port
4.37 + self.handler = handler
4.38 + self.options = options
4.39 + def run(self):
4.40 + print "worker running at port %s" % self.port
4.41 + self.serve_forever()
4.42 +
4.43 +if __name__ == "__main__":
4.44 + parser = optparse.OptionParser(usage="usage: %prog [options] port",
4.45 + option_list=option_list)
4.46 + options, args = parser.parse_args()
4.47 +
4.48 + if len(args) > 0:
4.49 + port = int(args[0])
4.50 + worker = Worker("localhost", port, Handler, options)
4.51 + worker.run()