X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=server.py;h=a3fa8e43eeb7c6a2ade762812e0caab8c9aa3e20;hb=31831b9e6147a89b20a97a52f4fe5e01acc283d0;hp=e9b519db5d92af4c74f34b50c5fd8df0bffdb419;hpb=43e1de9a436affa7c081fe7bb4e51ba3a1947a1e;p=plomrogue2-experiments diff --git a/server.py b/server.py index e9b519d..a3fa8e4 100755 --- a/server.py +++ b/server.py @@ -81,6 +81,9 @@ class IO_Handler(socketserver.BaseRequestHandler): class World: turn = 0 + map_size = (5, 5) + map_ = 'xxxxx\nx...x\nx.X.x\nx...x\nxxxxx' + player_pos = (3, 3) def fib(n): @@ -93,9 +96,12 @@ def fib(n): class CommandHandler: - def __init__(self, world, queues_out): - self.world = world + def __init__(self, queues_out): + from multiprocessing import Pool self.queues_out = queues_out + self.pool = Pool() + self.world = World() + self.pool_result = None def send_to(self, connection_id, msg): """Send msg to client of connection_id.""" @@ -112,7 +118,6 @@ class CommandHandler: Numbers are calculated in parallel as far as possible, using fib(). A 'CALCULATING …' message is sent to caller before the result. """ - from multiprocessing import Pool fib_fail = 'MALFORMED FIB REQUEST' if len(tokens) < 2: self.send_to(connection_id, fib_fail) @@ -125,16 +130,33 @@ class CommandHandler: self.send_to(connection_id, fib_fail) return self.send_to(connection_id, 'CALCULATING …') - with Pool(len(numbers)) as p: - results = p.map(fib, numbers) + results = self.pool.map(fib, numbers) reply = ' '.join([str(r) for r in results]) self.send_to(connection_id, reply) def cmd_inc(self, connection_id): - """Increment world.turn, send TURN_FINISHED, NEW_TURN to everyone.""" + """Increment world.turn, send game turn data to everyone. + + To simulate game processing waiting times, a one second delay between + TURN_FINISHED and NEW_TURN occurs; after NEW_TURN, some expensive + calculations are started as pool processes that need to be finished + until a further INC finishes the turn. + """ + from time import sleep + + def stringify_yx(tuple_): + return 'Y:' + str(tuple_[0]) + ',X:' + str(tuple_[1]) + + if self.pool_result is not None: + self.pool_result.wait() self.send_all('TURN_FINISHED ' + str(self.world.turn)) + sleep(1) self.world.turn += 1 self.send_all('NEW_TURN ' + str(self.world.turn)) + self.send_all('MAP_SIZE ' + stringify_yx(self.world.map_size)) + self.send_all('TERRAIN\n' + self.world.map_) + self.send_all('POSITION ' + stringify_yx(self.world.player_pos)) + self.pool_result = self.pool.map_async(fib, (35, 35)) def cmd_get_turn(self, connection_id): """Send world.turn to caller.""" @@ -188,8 +210,7 @@ def io_loop(q): sending out replies. """ queues_out = {} - world = World() - command_handler = CommandHandler(world, queues_out) + command_handler = CommandHandler(queues_out) while True: x = q.get() command_type = x[0]