Fixed process forking. Weird results when using two workers.
authorEugen Sawin <sawine@me73.com>
Mon, 14 Jun 2010 14:32:12 +0200
changeset 3234fa7eea0df
parent 2 b887ce19c300
child 4 4cee17e91d29
Fixed process forking. Weird results when using two workers.
com.py
server.py
worker.py
     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):