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