code: def _executor(self, jobGraph, stats, fileStore):
          
          if stats is not None:
              startTime = time.time()
              startClock = getTotalCpuTime()
          baseDir = os.getcwd()
  
          yield
  
          # If the job is not a checkpoint job, add the promise files to delete
          # to the list of jobStoreFileIDs to delete
          if not self.checkpoint:
              for jobStoreFileID in Promise.filesToDelete:
                  fileStore.deleteGlobalFile(jobStoreFileID)
          else:
              # Else copy them to the job wrapper to delete later
              jobGraph.checkpointFilesToDelete = list(Promise.filesToDelete)
          Promise.filesToDelete.clear()
          # Now indicate the asynchronous update of the job can happen
          fileStore._updateJobWhenDone()
          # Change dir back to cwd dir, if changed by job (this is a safety issue)
          if os.getcwd() != baseDir:
              os.chdir(baseDir)
          # Finish up the stats
          if stats is not None:
              totalCpuTime, totalMemoryUsage = getTotalCpuTimeAndMemoryUsage()
              stats.jobs.append(
                  Expando(
                      time=str(time.time() - startTime),
                      clock=str(totalCpuTime - startClock),
                      class_name=self._jobName(),
                      memory=str(totalMemoryUsage)
                  )
              )
docs: This is the core wrapping method for running the job within a worker.  It sets up the stats
          and logging before yielding. After completion of the body, the function will finish up the
          stats and logging, and starts the async update process for the job.