request_handler.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. try:
  20. requests = self.generator_stack[-1].send(self.reply)
  21. # Generated new request, so process
  22. if requests and requests[0][0] in self.handlers:
  23. # This next command potentially raises a finished message already, meaning that we should stop already
  24. # We avoid an extra try/except block by putting the None on the stack already
  25. self.reply = None
  26. self.handlers[requests[0][0]](requests[0][1])
  27. else:
  28. # MvS request, so forward that instead
  29. return requests
  30. except StopIteration:
  31. # Exception, so finished execution of this generator, passing on None to the caller
  32. #print("STOP for " + str(self.generator_stack))
  33. del self.generator_stack[-1]
  34. self.reply = [None]
  35. def execute_finish(self, request_args):
  36. del self.generator_stack[-1]
  37. self.reply = [None]
  38. def execute_sleep(self, request_args):
  39. raise primitive_functions.SleepKernel(request_args[0], request_args[1])
  40. def execute_return(self, request_args):
  41. del self.generator_stack[-1]
  42. self.reply = [request_args[0]]
  43. def execute_call(self, request_args):
  44. self.generator_stack.append(request_args[0])
  45. def execute_call_args(self, request_args):
  46. self.generator_stack.append(request_args[0](*(request_args[1])))
  47. def execute_call_kwargs(self, request_args):
  48. self.generator_stack.append(request_args[0](**(request_args[1])))