code: def _run_aborting_thread(self, abort_callback):
      if abort_callback is not None:
          abort_impl = CustomAbortImpl(abort_callback)
      elif not is_ipython():
          abort_impl = DefaultAbortImpl(pid=os.getpid())
      else:
          return
  
      websocket_factory = self._backend.websockets_factory(
          project_id=self._experiment._project.internal_id,
          experiment_id=self._experiment.internal_id,
      )
      if not websocket_factory:
          return
  
      self._aborting_thread = AbortingThread(
          websocket_factory=websocket_factory,
          abort_impl=abort_impl,
          experiment=self._experiment,
      )
      self._aborting_thread.start()
  
imports: import logging
  import os
  import sys
  import time
  import traceback
  from logging import StreamHandler
  from neptune.common.hardware.gauges.gauge_mode import GaugeMode
  from neptune.common.hardware.metrics.service.metric_service_factory import MetricServiceFactory
  from neptune.common.utils import in_docker, is_ipython, is_notebook
  from neptune.legacy.internal.abort import CustomAbortImpl, DefaultAbortImpl
  from neptune.legacy.internal.channels.channels import ChannelNamespace
  from neptune.legacy.internal.streams.channel_writer import ChannelWriter
  from neptune.legacy.internal.streams.stdstream_uploader import StdErrWithUpload, StdOutWithUpload
  from neptune.legacy.internal.threads.aborting_thread import AbortingThread
  from neptune.legacy.internal.threads.hardware_metric_reporting_thread import HardwareMetricReportingThread
  from neptune.legacy.internal.threads.ping_thread import PingThread
label_desc: Use image node_id 5 for calling the ExecutionContext obj's underlying member method code with example usage: obj._run_aborting_thread(abort_callback) without return types