request_handler.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import sys
  2. import modelverse_kernel.primitives as primitive_functions
  3. import modelverse_kernel.jit as jit
  4. from collections import defaultdict
  5. class RequestHandler(object):
  6. def __init__(self):
  7. self.generator_stack = []
  8. self.handlers = {"CALL": self.execute_call,
  9. "CALL_ARGS": self.execute_call_args,
  10. "CALL_KWARGS": self.execute_call_kwargs,
  11. "RETURN": self.execute_return,
  12. "FINISH": self.execute_finish,
  13. "SLEEP": self.execute_sleep}
  14. def push_generator(self, gen):
  15. self.generator_stack.append(gen)
  16. def handle_request(self, reply):
  17. self.reply = reply
  18. while self.generator_stack:
  19. requests = self.generator_stack[-1].send(self.reply)
  20. # Generated new request, so process
  21. if requests and requests[0][0] in self.handlers:
  22. # This next command potentially raises a finished message already, meaning that we should stop already
  23. # We avoid an extra try/except block by putting the None on the stack already
  24. self.handlers[requests[0][0]](requests[0][1])
  25. else:
  26. # MvS request, so forward that instead
  27. return requests
  28. def execute_finish(self, request_args):
  29. self.generator_stack = []
  30. def execute_sleep(self, request_args):
  31. raise primitive_functions.SleepKernel(request_args[0], request_args[1])
  32. def execute_return(self, request_args):
  33. del self.generator_stack[-1]
  34. self.reply = [request_args[0]]
  35. def execute_call(self, request_args):
  36. self.generator_stack.append(request_args[0])
  37. self.reply = None
  38. def execute_call_args(self, request_args):
  39. print("CALL " + str(request_args[0]))
  40. self.generator_stack.append(request_args[0](*(request_args[1])))
  41. self.reply = None
  42. def execute_call_kwargs(self, request_args):
  43. print("KWCALL " + str(request_args[0]))
  44. self.generator_stack.append(request_args[0](**(request_args[1])))
  45. self.reply = None