def start(self, *action_args, **action_kwargs):
        """
        Start listen to changes in the dataset. Additionally, args and kwargs can be passed to action
        by using the `action_*` arguments

        If the listener is already started, a ``ValueError`` will be raised

        """
        if self.is_running():
            raise ValueError("Listener is already running")

        job_step = self.__catch_exceptions__(cancel_on_failure=True)(self.__listener_iteration_job__)

        self.__listener_job__ = self.__scheduler__.every(self.interval_in_seconds).seconds.do(
            job_step, *action_args, **action_kwargs
        )

        class _ScheduleThread(threading.Thread):
            _WAIT_EVENT = threading.Event()

            _THREAD_LOGGER = logging.getLogger(__name__)

            @classmethod
            def run(cls):
                cls._THREAD_LOGGER.debug("Running listener thread...")
                while not cls._WAIT_EVENT.is_set():
                    self.__scheduler__.run_pending()
                    time.sleep(self.interval_in_seconds - 1)
                cls._THREAD_LOGGER.debug("Stopping listener thread...")

            @classmethod
            def stop(cls):
                cls._WAIT_EVENT.set()

        self.__current_thread__ = _ScheduleThread()
        self.__current_thread__.start()

        Start listen to changes in the dataset. Additionally, args and kwargs can be passed to action
        by using the `action_*` arguments

        If the listener is already started, a ``ValueError`` will be raised

        
argilla-v1/src/argilla_v1/listeners/listener.py