code: def _launch_abort_cb(self):
      timeout = self._abort_cb_timeout or 300.0
      if self._task and self._task.log:
          self._task.log.warning(
              "### TASK STOPPING - USER ABORTED - "
              "LAUNCHING CALLBACK (timeout {} sec) ###".format(timeout)
          )
  
      tic = time()
      timed_out = False
      try:
          callback_thread = Thread(target=self._inner_abort_cb_wrapper)
          callback_thread.daemon = True
          callback_thread.start()
          callback_thread.join(timeout=timeout)
          if callback_thread.is_alive():
              kill_thread(callback_thread, wait=False)
              timed_out = True
      except:  # noqa
          # something went wrong no just leave the process
          pass
  
      if self._task and self._task.log:
          self._task.log.warning(
              "### TASK STOPPING - USER ABORTED - CALLBACK {} ({:.2f} sec) ###".format(
                  "TIMED OUT"
                  if timed_out
                  else (
                      "COMPLETED" if self._cb_completed else "FAILED"
                  ),
                  time() - tic,
              )
          )
  
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 6 for calling the DevWorker obj's underlying member method code with example usage: obj._launch_abort_cb() without return types