Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import queue
  2. import time
  3. import threading
  4. from listeners.tick import GameThread
  5. from listeners import OnTick
  6.  
  7. class WorkerThread(GameThread):
  8.     result_queue = queue.Queue()
  9.  
  10.     def __init__(self):
  11.         self._stop_thread = threading.Event()
  12.         self.queue = queue.Queue()
  13.         super().__init__()
  14.  
  15.     def stop(self):
  16.         self._stop_thread.set()
  17.         self.join()
  18.  
  19.     def run(self):
  20.         while not self._stop_thread.is_set():
  21.             if self.queue.empty():
  22.                 time.sleep(0.1)
  23.                 continue
  24.  
  25.             exec_func, args, kwargs, result_handler = self.queue.get_nowait()
  26.             result = exec_func(*args, **kwargs)
  27.             self.queue.task_done()
  28.             if result_handler is not None:
  29.                 self.result_queue.put_nowait((result_handler, result))
  30.  
  31.     def add_job(self, exec_func, args=(), kwargs=None, result_handler=None):
  32.         self.queue.put_nowait(
  33.             (exec_func,
  34.             args, {} if kwargs is None else kwargs,
  35.             result_handler))
  36.  
  37. # This will ensure that we are executing the result_handler in the main
  38. # thread again.
  39. @OnTick
  40. def on_tick():
  41.     result_queue = WorkerThread.result_queue
  42.     if result_queue.empty():
  43.         return
  44.  
  45.     result_handler, result = result_queue.get_nowait()
  46.     result_handler(result)
  47.     result_queue.task_done()
  48.  
  49.  
  50. # Test code
  51. worker = WorkerThread()
  52. worker.start()
  53.  
  54. from commands.typed import TypedServerCommand
  55.  
  56. @TypedServerCommand('sleep')
  57. def on_sleep(info, duration:float):
  58.     worker.add_job(
  59.         lambda: time.sleep(duration),
  60.         result_handler=lambda x: print('SLEEPT', duration))
  61.  
  62. def unload()
  63.     worker.stop()