def _run_test(self, test_nodeid: nodeid.Nodeid): result_queue: "multiprocessing.Queue[Union[result_tree.Node, plugin.TestReport, int]]" = ( multiprocessing.Queue()) proc = multiprocessing.Process( target=plugin.run_test, args=(test_nodeid, result_queue, self._directory), ) LOGGER.debug("running test %s", nodeid) proc.start() run_tree = eventlet_utils.get_queue_noblock(result_queue) LOGGER.debug("got run_tree %s", run_tree) self.result_tree.merge(run_tree, test_nodeid) node = self._node_index[test_nodeid] if node.status == result_tree.TestState.INIT: node.status = result_tree.TestState.RUNNING self._send_update() eventlet.sleep() while True: val = eventlet_utils.get_queue_noblock(result_queue) if val == plugin.DONE: LOGGER.debug("DONE received, breaking") break LOGGER.debug("adding test report %s", val) self._add_test_report(val) self._send_update() LOGGER.debug("joining child proc...") proc.join() LOGGER.debug("child proc joined")
def _watch_fs_events(self, queue: multiprocessing.Queue): while True: event = eventlet_utils.get_queue_noblock(queue) try: self._handle_fs_event(event) except Exception: LOGGER.exception("unexpected error while handling filesystem event")
def collect_path( path: str, root_dir: str, ) -> result_tree.BranchNode: if not path.startswith(root_dir): raise ValueError( f"path {path} does not appear to be within root dir {root_dir}") mp_queue: "multiprocessing.Queue[Union[result_tree.Node, TestReport, int]]" = ( multiprocessing.Queue()) proc = multiprocessing.Process(target=_collect_path, args=(path, root_dir, mp_queue)) proc.start() res = eventlet_utils.get_queue_noblock(mp_queue) proc.join() if not isinstance(res, result_tree.BranchNode): raise TypeError(f"unexpected return from queue: {res}") return cast(result_tree.BranchNode, res)