code: def run_job(
      self,
      job: JobExecutorInterface,
  ):
      if job.is_group():
          # if we still don't have enough workers for this group, create a new pool here
          missing_workers = max(len(job) - self.workers, 0)
          if missing_workers:
              self.workers += missing_workers
              self.pool = concurrent.futures.ThreadPoolExecutor(
                  max_workers=self.workers
              )
  
          # the future waits for the entire group job
          future = self.pool.submit(self.run_group_job, job)
      else:
          future = self.run_single_job(job)
  
      job_info = SubmittedJobInfo(job=job)
  
      future.add_done_callback(partial(self._callback, job_info))
      self.report_job_submission(job_info)
  
imports: import os
  from pathlib import Path
  import sys
  import time
  import shlex
  import concurrent.futures
  import subprocess
  from functools import partial
  from snakemake.common import async_run
  from snakemake.executors import change_working_directory
  from snakemake.settings import DeploymentMethod
  from snakemake_interface_executor_plugins.executors.base import SubmittedJobInfo
  from snakemake_interface_executor_plugins.executors.real import RealExecutor
  from snakemake_interface_executor_plugins.dag import DAGExecutorInterface
  from snakemake_interface_executor_plugins.workflow import WorkflowExecutorInterface
  from snakemake_interface_executor_plugins.logging import LoggerExecutorInterface
  from snakemake_interface_executor_plugins.jobs import JobExecutorInterface, SingleJobExecutorInterface, GroupJobExecutorInterface
  from snakemake_interface_executor_plugins.settings import ExecMode, CommonSettings
  from snakemake.shell import shell
  from snakemake.logging import logger
  from snakemake.exceptions import print_exception, get_exception_origin
  from snakemake.exceptions import format_error, RuleException, log_verbose_traceback
  from snakemake.exceptions import WorkflowError, SpawnedJobError, CacheMissException
label_desc: Use image node_id 8 for calling the Executor obj's underlying member method code with example usage: obj.run_job(job) without return types