task.xml 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <class name="Task">
  2. <relationships>
  3. <association name="parent" class="MvKController" min="1" max="1"/>
  4. </relationships>
  5. <constructor>
  6. <parameter name="taskname"/>
  7. <parameter name="mvs_operations"/>
  8. <parameter name="mvk"/>
  9. <body>
  10. <![CDATA[
  11. self.taskname = taskname
  12. self.mvs_operations = mvs_operations
  13. self.mvk = mvk
  14. self.failed = False
  15. self.output_queue = []
  16. self.outputs = []
  17. ]]>
  18. </body>
  19. </constructor>
  20. <method name="execute_modelverse">
  21. <parameter name="taskname"/>
  22. <parameter name="operation"/>
  23. <parameter name="params"/>
  24. <body>
  25. <![CDATA[
  26. reply = None
  27. commands = []
  28. mvk = self.mvk
  29. mvs_operations = self.mvs_operations
  30. try:
  31. while 1:
  32. commands = mvk.execute_yields(taskname, operation, params, reply)
  33. if commands is None:
  34. break
  35. reply = [mvs_operations[command[0]](*(command[1])) for command in commands]
  36. except:
  37. print("ERROR: " + str(self.mvk.debug_info.get(taskname, "Unknown taskname")))
  38. #TODO delete self, as the task has crashed!
  39. return False
  40. return True
  41. ]]>
  42. </body>
  43. </method>
  44. <scxml initial="start">
  45. <parallel id="start">
  46. <state id="execution" initial="running">
  47. <state id="running" initial="executing">
  48. <transition event="pause_task" target="../suspended"/>
  49. <state id="executing">
  50. <onentry>
  51. <script>
  52. start_time = time.time()
  53. # Grant each task some milliseconds of execution
  54. while (time.time() - start_time &lt; 0.05):
  55. if not self.execute_modelverse(self.taskname, "execute_rule", []):
  56. # Failed!
  57. self.failed = True
  58. break
  59. if not self.mvk.success:
  60. # Blocking or broken, so quit already to stop wasting CPU
  61. break
  62. if not self.failed:
  63. # Perform output if there is anything
  64. while self.output_queue:
  65. if self.execute_modelverse(self.taskname, "get_output", []):
  66. if self.mvk.success:
  67. self.outputs.append((self.output_queue.pop(0), self.mvk.returnvalue))
  68. else:
  69. # No output left in Mv, so break
  70. break
  71. else:
  72. self.failed = True
  73. break
  74. </script>
  75. </onentry>
  76. <transition cond="self.failed" target="../../failed"/>
  77. <transition after="self.sccd_yield()" target="."/>
  78. <transition cond="not self.mvk.success" target="../yielded"/>
  79. </state>
  80. <state id="yielded">
  81. <transition after="self.sccd_yield() + 0.5" target="../executing"/>
  82. <transition event="processed_input" target="../executing"/>
  83. </state>
  84. </state>
  85. <state id="suspended">
  86. <state id="suspended">
  87. <transition event="resume" target="../../running"/>
  88. </state>
  89. </state>
  90. <state id="failed">
  91. <state id="failed">
  92. <!-- TODO delete task -->
  93. </state>
  94. </state>
  95. </state>
  96. <state id="process_events">
  97. <state id="process_events">
  98. <transition event="input" target=".">
  99. <parameter name="params"/>
  100. <script>
  101. for args_entry in params:
  102. if not self.execute_modelverse(self.taskname, "set_input", [args_entry]):
  103. # Failed!
  104. self.failed = True
  105. break
  106. </script>
  107. <raise event="processed_input"/>
  108. </transition>
  109. <transition event="output" target=".">
  110. <parameter name="params"/>
  111. <script>
  112. self.output_queue.append(params)
  113. </script>
  114. </transition>
  115. <transition cond="self.outputs" target=".">
  116. <script>
  117. source, value = self.outputs.pop(0)
  118. </script>
  119. <raise event="HTTP_input" scope="narrow" target="'parent/to_mvi/%s' % source">
  120. <parameter expr="json.dumps(value)"/>
  121. </raise>
  122. </transition>
  123. </state>
  124. </state>
  125. </parallel>
  126. </scxml>
  127. </class>