code: def finish(self) -> None:
      if self._process is None:
          return None
      logger.info("Stopping system monitor")
      self._shutdown_event.set()
      for asset in self.assets:
          asset.finish()
      try:
          self._process.join()
      except Exception as e:
          logger.error(f"Error joining system monitor process: {e}")
      self._process = None
  
imports: import datetime
  import logging
  import queue
  import threading
  from collections import defaultdict, deque
  from typing import TYPE_CHECKING, Deque, Dict, List, Optional, Tuple
  from .assets.asset_registry import asset_registry
  from .assets.interfaces import Asset, Interface
  from .assets.open_metrics import OpenMetrics
  from .system_info import SystemInfo
label_desc: Use image node_id 8 for calling the SystemMonitor obj's underlying member method code with example usage: obj.finish() and returns: None