class_docstr: Thin wrapper around a ProcessPoolExecutor, or a ThreadPoolExecutor where
  the former may be unsafe.
code: def __init__(self, use_processes=False):
      (
          processpool_max_workers,
          threadpool_max_workers,
      ) = _compute_executor_max_workers()
      if use_processes:
          mp_start_method = multiprocessing.get_start_method(
              allow_none=True
          )
          if mp_start_method == "spawn":
              self._executor = ProcessPoolExecutor(
                  max_workers=processpool_max_workers
              )
          elif sys.version_info[:2] >= (3, 7):
              self._executor = ProcessPoolExecutor(
                  mp_context=multiprocessing.get_context("spawn"),
                  max_workers=processpool_max_workers,
              )
          else:
              raise MetaflowException(
                  msg="Cannot use ProcessPoolExecutor because Python version is older than 3.7 and multiprocess start method has been set to something other than 'spawn'"
              )
      else:
          self._executor = ThreadPoolExecutor(
              max_workers=threadpool_max_workers
          )
  
file_path: metaflow/metaflow/plugins/storage_executor.py
imports: import math
  import multiprocessing
  import os
  import platform
  import sys
  from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
  from metaflow.exception import MetaflowException
label_desc: Use image node_id 1 to create a new StorageExecutor object from inherited base classes: object with example: obj = StorageExecutor(use_processes)