# HG changeset patch # User Eugen Sawin # Date 1276518732 -7200 # Node ID 234fa7eea0df9d6f2c0a1ea88e7b79ec0db488e4 # Parent b887ce19c300c82faf3061e47deb76d50f38325c Fixed process forking. Weird results when using two workers. diff -r b887ce19c300 -r 234fa7eea0df com.py --- a/com.py Sun Jun 13 04:34:03 2010 +0200 +++ b/com.py Mon Jun 14 14:32:12 2010 +0200 @@ -56,14 +56,27 @@ def update(socket, client, worker, (modelName, iterations)): model = lookupModel(socket, client, modelName) if model: - for w in worker: + old_res = model.resolution + begin_y = model.range[0].imag + end_y = model.range[1].imag + begin_x = model.range[0].real + end_x = model.range[1].real + step_x = (end_x - begin_x) / len(worker) + model.resolution = (old_res[0] / len(worker), old_res[1]) + + for i, w in enumerate(worker): + new_begin_x = begin_x + step_x * i + new_end_x = begin_x + step_x * (i + 1) + model.range = (complex(new_begin_x, begin_y), + complex(new_end_x, end_y)) + print model.range + print model.resolution dump = pickle.dumps(model) - print w - socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)), - w) - #model.update(int(iterations)) + socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)), w) socket.sendto("model %s updated with max %s iterations\n" % (modelName, iterations), client) + model.range = (complex(begin_x, begin_y), complex(end_x, end_y)) + model.resolution = old_res commands = {"help": (help, "help"), "create model": (createModel, "creates a new model"), @@ -73,4 +86,4 @@ "set resolution": (setResolution, "sets the model resolution"), "set range": (setRange, "sets the model range"), "update": (update, "updates the model data"), - "add observer": (addObserver, "adds an observer to a model's events")} + "add observer": (addObserver, "adds an observer to a model's events"),} diff -r b887ce19c300 -r 234fa7eea0df server.py --- a/server.py Sun Jun 13 04:34:03 2010 +0200 +++ b/server.py Mon Jun 14 14:32:12 2010 +0200 @@ -20,7 +20,7 @@ print data for key, value in com.commands.iteritems(): if key in data: - args = data.partition(key)[2].split() + args = data.partition(key)[2].split() if args: value[0](socket, self.client_address, self.worker, args) else: @@ -41,8 +41,9 @@ port = server[1] + 1 worker_list = [] for i in xrange(n): + print "starting worker %i" % (port + i) #worker.spawn(server[0], port + i) - subprocess.Popen(["python worker.py", str(port + i)], shell=True) + subprocess.Popen("python worker.py %i" % (port + i), shell=True) worker_list.append((server[0], port + i)) return worker_list diff -r b887ce19c300 -r 234fa7eea0df worker.py --- a/worker.py Sun Jun 13 04:34:03 2010 +0200 +++ b/worker.py Mon Jun 14 14:32:12 2010 +0200 @@ -19,12 +19,10 @@ 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):