code: def shutdown(self, wait=True, *, cancel_futures=False):
      if sys.version_info > (3, 9):
          return super().shutdown(
              wait=wait, cancel_futures=cancel_futures
          )
      else:  # noqa: RET505
          with self._shutdown_lock:
              self._shutdown = True
              if cancel_futures:
                  # Drain all work items from the queue, and then cancel
                  # their associated futures.
                  while True:
                      try:
                          work_item = self._work_queue.get_nowait()
                      except queue.Empty:
                          break
                      if work_item is not None:
                          work_item.future.cancel()
  
              # Send a wake-up to prevent threads calling
              # _work_queue.get(block=True) from permanently blocking.
              self._work_queue.put(None)  # type: ignore[arg-type]
          if wait:
              for t in self._threads:
                  t.join()
  
file_path: dvc/dvc/utils/threadpool.py
imports: import queue
  import sys
  from concurrent import futures
  from itertools import islice
  from typing import Any, Callable, Iterable, Iterator, Optional, Set, TypeVar
label_desc: Use image node_id 4 for calling the ThreadPoolExecutor obj's underlying member method code with example usage: obj.shutdown(wait) and returns: super