server.py
author Eugen Sawin <sawine@me73.com>
Mon, 14 Jun 2010 23:16:47 +0200
changeset 4 4cee17e91d29
parent 3 234fa7eea0df
child 5 5ab3cc2e7851
permissions -rw-r--r--
Added worker result feedback.
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@0
    21
		print "%s wrote:" % self.client_address[0]
sawine@0
    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@4
    33
			cell = pickle.loads(data)
sawine@4
    34
			self.cells[cell[0]] = cell[1]
sawine@4
    35
			#print hashlib.sha256(str(self.cells)).hexdigest()
sawine@4
    36
			
sawine@0
    37
		
sawine@0
    38
class Server(SocketServer.UDPServer):
sawine@2
    39
	def __init__(self, host, port, handler, options, worker):
sawine@0
    40
		SocketServer.UDPServer.__init__(self, (host, port), handler)
sawine@0
    41
		self.host = host
sawine@0
    42
		self.port = port
sawine@0
    43
		self.handler = handler
sawine@0
    44
		self.options = options
sawine@2
    45
		self.handler.worker = worker
sawine@4
    46
		self.handler.cells = {}
sawine@0
    47
	def run(self):
sawine@0
    48
		self.serve_forever()
sawine@2
    49
sawine@2
    50
def spawnWorker(server, n):
sawine@2
    51
	port = server[1] + 1
sawine@2
    52
	worker_list = [] 
sawine@2
    53
	for i in xrange(n):
sawine@3
    54
		print "starting worker %i" % (port + i)
sawine@2
    55
		#worker.spawn(server[0], port + i)
sawine@3
    56
		subprocess.Popen("python worker.py %i" % (port + i), shell=True)
sawine@2
    57
		worker_list.append((server[0], port + i)) 
sawine@2
    58
	return worker_list		
sawine@2
    59
sawine@0
    60
if __name__ == "__main__":
sawine@2
    61
	parser = optparse.OptionParser(usage="usage: %prog [options] port worker",
sawine@0
    62
		option_list=option_list)
sawine@0
    63
	options, args = parser.parse_args()
sawine@0
    64
	
sawine@0
    65
	if len(args) > 0:
sawine@2
    66
		host = "localhost"
sawine@0
    67
		port = int(args[0])
sawine@2
    68
		worker_count = int(args[1])
sawine@2
    69
		worker = spawnWorker((host, port), worker_count)
sawine@2
    70
		server = Server(host, port, Handler, options, worker)
sawine@0
    71
		server.run()