def finish(self, job, update_dynamic=True):
    'Finish a given job (e.g. remove from ready jobs, mark depending jobs\n        as ready).'
    try:
        self._ready_jobs.remove(job)
    except KeyError:
        pass
    if job.is_group():
        jobs = job
    else:
        jobs = [job]
    self._finished.update(jobs)
    updated_dag = False
    if update_dynamic:
        updated_dag = self.update_checkpoint_dependencies(jobs)
    self.update_ready((j for job in jobs for j in self.depending[job] if ((not self.in_until(job)) and self.needrun(j))))
    for job in jobs:
        if (update_dynamic and job.dynamic_output):
            logger.info('Dynamically updating jobs')
            newjob = self.update_dynamic(job)
            if newjob:
                self.omitforce.add(newjob)
                self._needrun.add(newjob)
                self._finished.add(newjob)
                updated_dag = True
                self.postprocess()
                self.handle_protected(newjob)
                self.handle_touch(newjob)
    if updated_dag:
        if self.workflow.use_singularity:
            self.pull_container_imgs()
        if self.workflow.use_conda:
            self.create_conda_envs()
Finish a given job (e.g. remove from ready jobs, mark depending jobs
as ready).
def finish(self, job, update_dynamic=True):
    'Finish a given job (e.g. remove from ready jobs, mark depending jobs\n        as ready).'
    try:
        self._ready_jobs.remove(job)
    except KeyError:
        pass
    if job.is_group():
        jobs = job
    else:
        jobs = [job]
    self._finished.update(jobs)
    updated_dag = False
    if update_dynamic:
        updated_dag = self.update_checkpoint_dependencies(jobs)
    self.update_ready((j for job in jobs for j in self.depending[job] if ((not self.in_until(job)) and self.needrun(j))))
    for job in jobs:
        if (update_dynamic and job.dynamic_output):
            logger.info('Dynamically updating jobs')
            newjob = self.update_dynamic(job)
            if newjob:
                self.omitforce.add(newjob)
                self._needrun.add(newjob)
                self._finished.add(newjob)
                updated_dag = True
                self.postprocess()
                self.handle_protected(newjob)
                self.handle_touch(newjob)
    if updated_dag:
        if self.workflow.use_singularity:
            self.pull_container_imgs()
        if self.workflow.use_conda:
            self.create_conda_envs()