server.py
author Eugen Sawin <sawine@me73.com>
Thu, 17 Jun 2010 23:24:41 +0200
changeset 6 9147c845cecb
parent 5 5ab3cc2e7851
permissions -rw-r--r--
Client skeleton added.
     1 #!/usr/bin/python
     2 
     3 import com
     4 import worker
     5 import optparse
     6 import pickle
     7 import hashlib
     8 import subprocess
     9 import SocketServer
    10 
    11 option_list = [
    12 	optparse.make_option("-q", "--quiet", action="store_true", dest="quiet", 
    13 		help="quiet mode", default=False)]
    14 	
    15 class Handler(SocketServer.BaseRequestHandler):
    16 	"""
    17 	"""	
    18 	def handle(self):
    19 		data = self.request[0]
    20 		socket = self.request[1]
    21 		#print "%s wrote:" % self.client_address[0]
    22 		#print data
    23 		key_found = False
    24 		for key, value in com.commands.iteritems():
    25 			if key in data:
    26 				key_found = True
    27 				args = data.partition(key)[2].split()				
    28 				if args:
    29 					value[0](socket, self.client_address, self.worker, args)
    30 				else:
    31 					value[0](socket, self.client_address, self.worker)
    32 		if not key_found:
    33 			print "unkown command: " + data
    34 			return
    35 			model_name, _, cell_data = data.partition(" ")
    36 			cell = pickle.loads(cell_data)
    37 			#self.cells[cell[0]] = cell[1]			
    38 			model = com.getModel(model_name)
    39 			#print cell
    40 			model.cells[cell[0]] = cell[1]
    41 			#print hashlib.sha256(str(self.cells)).hexdigest()
    42 			
    43 		
    44 class Server(SocketServer.UDPServer):
    45 	def __init__(self, host, port, handler, options, worker):
    46 		SocketServer.UDPServer.__init__(self, (host, port), handler)
    47 		self.host = host
    48 		self.port = port
    49 		self.handler = handler
    50 		self.options = options
    51 		self.handler.worker = worker
    52 		self.handler.cells = {}
    53 	def run(self):
    54 		self.serve_forever()
    55 
    56 def spawnWorker(server, n):
    57 	port = server[1] + 1
    58 	worker_list = [] 
    59 	for i in xrange(n):
    60 		print "starting worker %i" % (port + i)
    61 		#worker.spawn(server[0], port + i)
    62 		subprocess.Popen("python worker.py %i" % (port + i), shell=True)
    63 		worker_list.append((server[0], port + i)) 
    64 	return worker_list		
    65 
    66 if __name__ == "__main__":
    67 	parser = optparse.OptionParser(usage="usage: %prog [options] port worker",
    68 		option_list=option_list)
    69 	options, args = parser.parse_args()
    70 	
    71 	if len(args) > 0:
    72 		host = "localhost"
    73 		port = int(args[0])
    74 		worker_count = int(args[1])
    75 		worker = spawnWorker((host, port), worker_count)
    76 		server = Server(host, port, Handler, options, worker)
    77 		server.run()