docstr: Do stuff after job is finished.
docstr_tok: ["Do","stuff","after","job","is","finished","."]
code: def _proceed(self, job):
      """Do stuff after job is finished."""
      with self._lock:
          logger.debug(
              f"Completion of job {job.rules} reported to scheduler."
          )
          self._tofinish.append(job)
  
          if self.dryrun:
              if (
                  len(self.running)
                  - len(self._tofinish)
                  - len(self._toerror)
                  <= 0
              ):
                  # During dryrun, only release when all running jobs are done.
                  # This saves a lot of time, as self.open_jobs has to be
                  # evaluated less frequently.
                  self._open_jobs.release()
          else:
              # go on scheduling if there is any free core
              self._open_jobs.release()
  
imports: import asyncio
  from collections import defaultdict
  import math
  import os, signal, sys
  import threading
  from functools import partial
  from itertools import chain, accumulate
  from contextlib import ContextDecorator
  from snakemake_interface_executor_plugins.scheduler import JobSchedulerExecutorInterface
  from snakemake_interface_executor_plugins.registry import ExecutorPluginRegistry
  from snakemake_interface_executor_plugins.registry import Plugin
  from snakemake_interface_executor_plugins.settings import ExecMode
  from snakemake.common import async_run
  from snakemake.exceptions import RuleException, WorkflowError, print_exception
  from snakemake.logging import logger
  from fractions import Fraction
label_desc: Use image node_id 13 for calling the JobScheduler obj's underlying member method code with example usage: obj._proceed(job) without return types