code: def _daemon(self):
      last_ping = time()
      while self._task is not None:
          try:
              wait_timeout = min(
                  float(self.ping_period), float(self.report_period)
              )
              if self._poll_freq:
                  wait_timeout = min(self._poll_freq, wait_timeout)
              if self._exit_event.wait(wait_timeout):
                  return
              # send ping request
              if self._support_ping and (time() - last_ping) >= float(
                  self.ping_period
              ):
                  self.ping()
                  last_ping = time()
  
              if self._dev_stop_signal:
                  stop_reason = self._dev_stop_signal.test()
                  if stop_reason and self._task:
                      # call abort callback
                      if self._abort_cb:
                          self._launch_abort_cb()
  
                      # noinspection PyProtectedMember
                      self._task._dev_mode_stop_task(stop_reason)
          except Exception:  # noqa
              pass
  
file_path: clearml/clearml/backend_interface/task/development/worker.py
imports: import attr
  from threading import Thread
  from time import time
  from ....config import deferred_config
  from ....backend_interface.task.development.stop_signal import TaskStopSignal
  from ....backend_api.services import tasks
  from ....utilities.lowlevel.threads import kill_thread
  from ....utilities.process.mp import SafeEvent
label_desc: Use image node_id 7 for calling the DevWorker obj's underlying member method code with example usage: obj._daemon() without return types