Added worker.
authorEugen Sawin <sawine@me73.com>
Sun, 13 Jun 2010 04:34:03 +0200
changeset 2b887ce19c300
parent 1 0ebb73fd094a
child 3 234fa7eea0df
Added worker.
algorithm.py
com.py
server.py
worker.py
     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()