def METHOD_NAME(self, runnable):
    # pylint: disable=W0201
    self.runnable = runnable
    yield messages.StartedMessage.get()
    try:
        queue = multiprocessing.SimpleQueue()
        process = multiprocessing.Process(
            target=self._run_avocado, args=(self.runnable, queue)
        )
        process.start()
        time_started = time.monotonic()
        timeout = float(self.DEFAULT_TIMEOUT)
        next_status_time = None
        while True:
            time.sleep(RUNNER_RUN_CHECK_INTERVAL)
            now = time.monotonic()
            if queue.empty():
                if next_status_time is None or now > next_status_time:
                    next_status_time = now + RUNNER_RUN_STATUS_INTERVAL
                    yield messages.RunningMessage.get()
                if (now - time_started) > timeout:
                    process.terminate()
                    yield messages.FinishedMessage.get("interrupted", "timeout")
                    break
            else:
                message = queue.get()
                if message.get("type") == "early_state":
                    timeout = float(message.get("timeout") or self.DEFAULT_TIMEOUT)
                else:
                    yield message
                if message.get("status") == "finished":
                    break
    except Exception as e:
        yield messages.StderrMessage.get(traceback.format_exc())
        yield messages.FinishedMessage.get(
            "error",
            fail_reason=str(e),
            fail_class=e.__class__.__name__,
            traceback=traceback.format_exc(),
        )