def METHOD_NAME(self, runnable):
    # pylint: disable=W0201
    self.runnable = runnable
    yield self.prepare_status("started")
    sysinfo_config = self.runnable.kwargs.get("sysinfo", {})
    test_fail = self.runnable.kwargs.get("test_fail", False)
    if self.runnable.uri not in ["pre", "post"]:
        yield messages.StderrMessage.get(
            f"Unsupported uri"
            f"{self.runnable.uri}. "
            f"Possible values, 'pre', 'post'"
        )
        yield messages.FinishedMessage.get("error")
    try:
        queue = multiprocessing.SimpleQueue()
        if self.runnable.uri == "pre":
            sysinfo = PreSysInfo(self.runnable.config, sysinfo_config, queue)
        else:
            sysinfo = PostSysInfo(
                self.runnable.config, sysinfo_config, queue, test_fail
            )
        sysinfo_process = multiprocessing.Process(target=sysinfo.collect)
        sysinfo_process.start()
        most_current_execution_state_time = None
        while True:
            time.sleep(RUNNER_RUN_CHECK_INTERVAL)
            now = time.monotonic()
            if queue.empty():
                if most_current_execution_state_time is not None:
                    next_execution_state_mark = (
                        most_current_execution_state_time
                        + RUNNER_RUN_STATUS_INTERVAL
                    )
                if (
                    most_current_execution_state_time is None
                    or now > next_execution_state_mark
                ):
                    most_current_execution_state_time = now
                    yield messages.RunningMessage.get()
            else:
                message = queue.get()
                yield message
                if message.get("status") == "finished":
                    break
    except Exception:  # pylint: disable=W0703
        yield messages.StderrMessage.get(traceback.format_exc())
        yield messages.FinishedMessage.get("error")