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