com.py
author Eugen Sawin <sawine@me73.com>
Mon, 14 Jun 2010 14:32:12 +0200
changeset 3 234fa7eea0df
parent 2 b887ce19c300
child 4 4cee17e91d29
permissions -rw-r--r--
Fixed process forking. Weird results when using two workers.
     1 import model
     2 import pickle
     3 
     4 commands = {}
     5 
     6 def help(socket, client, worker):
     7 	socket.sendto("\n".join([key + ": " + value[1] 
     8 		for key, value in commands.iteritems()]) + "\n", client)
     9 
    10 def createModel(socket, client, worker, (name,)):
    11 	model.createModel(name)
    12 	socket.sendto("model %s created\n" % name, client)
    13 	
    14 def deleteModel(socket, client, worker, (name,)):
    15 	if model.deleteModel(name):
    16 		socket.sendto("model %s deleted\n" % name, client)
    17 		
    18 def saveModel(socket, client, worker, (name,)):
    19 	model = lookupModel(socket, client, name)
    20 	if model:
    21 		pickle.dump(model, open(name, "w"))
    22 		socket.sendto("model %s saved\n" % name, client)
    23 		
    24 def loadModel(socket, client, worker, (name,)):	
    25 	model.addModel(pickle.load(open(name, "r")))
    26 	socket.sendto("model %s loaded\n" % name, client)		
    27 		
    28 def lookupModel(socket, client, name):
    29 	if name not in model.models:
    30 		socket.sendto("model %s not found\n" % name, client)
    31 		return None
    32 	else:
    33 		return model.models[name]
    34 		
    35 def addObserver(socket, client, worker, (modelName, eventType)):
    36 	model = lookupModel(socket, client, modelName)
    37 	if model:
    38 		model.register(socket, client, eventType)
    39 		socket.sendto("observer for event type %s added: " % eventType 
    40 			+ str(client) + "\n", client)
    41 		
    42 def setResolution(socket, client, worker, (modelName, x, y)):
    43 	model = lookupModel(socket, client, modelName)
    44 	if model:
    45 		model.setResolution(int(x), int(y))
    46 		socket.sendto("model %s resolution set to %s, %s\n" % 
    47 			(modelName, x, y), client)
    48 			
    49 def setRange(socket, client, worker, (modelName, begin, end)):
    50 	model = lookupModel(socket, client, modelName)
    51 	if model:
    52 		model.setRange(complex(begin), complex(end))
    53 		socket.sendto("model %s range set to %s, %s\n" % 
    54 			(modelName, begin, end), client)
    55 
    56 def update(socket, client, worker, (modelName, iterations)):
    57 	model = lookupModel(socket, client, modelName)
    58 	if model:
    59 		old_res = model.resolution
    60 		begin_y = model.range[0].imag
    61 		end_y = model.range[1].imag
    62 		begin_x = model.range[0].real
    63 		end_x = model.range[1].real
    64 		step_x = (end_x - begin_x) / len(worker)
    65 		model.resolution = (old_res[0] / len(worker), old_res[1])
    66 
    67 		for i, w in enumerate(worker):
    68 			new_begin_x = begin_x + step_x * i
    69 			new_end_x = begin_x + step_x * (i + 1)
    70 			model.range = (complex(new_begin_x, begin_y), 
    71 							complex(new_end_x, end_y))
    72 			print model.range
    73 			print model.resolution
    74 			dump = pickle.dumps(model)
    75 			socket.sendto("%010i%s%010i" % (len(dump), dump, int(iterations)), w) 
    76 		socket.sendto("model %s updated with max %s iterations\n" 
    77 			% (modelName, iterations), client)
    78 		model.range = (complex(begin_x, begin_y), complex(end_x, end_y))
    79 		model.resolution = old_res
    80 		
    81 commands = {"help": (help, "help"),
    82 	"create model": (createModel, "creates a new model"),
    83 	"delete model": (deleteModel, "deletes a model"),	
    84 	"save model": (saveModel, "makes a persistent copy of the model"),
    85 	"load model": (loadModel, "loads a persistent model"),
    86 	"set resolution": (setResolution, "sets the model resolution"),
    87 	"set range": (setRange, "sets the model range"),
    88 	"update": (update, "updates the model data"),
    89 	"add observer": (addObserver, "adds an observer to a model's events"),}