Fixed process forking. Weird results when using two workers.
1.1 --- a/com.py Sun Jun 13 04:34:03 2010 +0200
1.2 +++ b/com.py Mon Jun 14 14:32:12 2010 +0200
1.3 @@ -56,14 +56,27 @@
1.4 def update(socket, client, worker, (modelName, iterations)):
1.5 model = lookupModel(socket, client, modelName)
1.6 if model:
1.7 - for w in worker:
1.8 + old_res = model.resolution
1.9 + begin_y = model.range[0].imag
1.10 + end_y = model.range[1].imag
1.11 + begin_x = model.range[0].real
1.12 + end_x = model.range[1].real
1.13 + step_x = (end_x - begin_x) / len(worker)
1.14 + model.resolution = (old_res[0] / len(worker), old_res[1])
1.15 +
1.16 + for i, w in enumerate(worker):
1.17 + new_begin_x = begin_x + step_x * i
1.18 + new_end_x = begin_x + step_x * (i + 1)
1.19 + model.range = (complex(new_begin_x, begin_y),
1.20 + complex(new_end_x, end_y))
1.21 + print model.range
1.22 + print model.resolution
1.23 dump = pickle.dumps(model)
1.24 - print w
1.25 - socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)),
1.26 - w)
1.27 - #model.update(int(iterations))
1.28 + socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)), w)
1.29 socket.sendto("model %s updated with max %s iterations\n"
1.30 % (modelName, iterations), client)
1.31 + model.range = (complex(begin_x, begin_y), complex(end_x, end_y))
1.32 + model.resolution = old_res
1.33
1.34 commands = {"help": (help, "help"),
1.35 "create model": (createModel, "creates a new model"),
1.36 @@ -73,4 +86,4 @@
1.37 "set resolution": (setResolution, "sets the model resolution"),
1.38 "set range": (setRange, "sets the model range"),
1.39 "update": (update, "updates the model data"),
1.40 - "add observer": (addObserver, "adds an observer to a model's events")}
1.41 + "add observer": (addObserver, "adds an observer to a model's events"),}
2.1 --- a/server.py Sun Jun 13 04:34:03 2010 +0200
2.2 +++ b/server.py Mon Jun 14 14:32:12 2010 +0200
2.3 @@ -20,7 +20,7 @@
2.4 print data
2.5 for key, value in com.commands.iteritems():
2.6 if key in data:
2.7 - args = data.partition(key)[2].split()
2.8 + args = data.partition(key)[2].split()
2.9 if args:
2.10 value[0](socket, self.client_address, self.worker, args)
2.11 else:
2.12 @@ -41,8 +41,9 @@
2.13 port = server[1] + 1
2.14 worker_list = []
2.15 for i in xrange(n):
2.16 + print "starting worker %i" % (port + i)
2.17 #worker.spawn(server[0], port + i)
2.18 - subprocess.Popen(["python worker.py", str(port + i)], shell=True)
2.19 + subprocess.Popen("python worker.py %i" % (port + i), shell=True)
2.20 worker_list.append((server[0], port + i))
2.21 return worker_list
2.22
3.1 --- a/worker.py Sun Jun 13 04:34:03 2010 +0200
3.2 +++ b/worker.py Mon Jun 14 14:32:12 2010 +0200
3.3 @@ -19,12 +19,10 @@
3.4 def handle(self):
3.5 data = self.request[0].strip()
3.6 socket = self.request[1]
3.7 - print "%s wrote:" % self.client_address[0]
3.8 model_size = int(data[:10])
3.9 model = pickle.loads(data[10:10+model_size])
3.10 max_iter = int(data[10+model_size:20+model_size])
3.11 model.update(max_iter)
3.12 - socket.sendto("finished\n", self.client_address)
3.13
3.14 class Worker(SocketServer.UDPServer):
3.15 def __init__(self, host, port, handler, options):