code: def _checkSuccessorReadyToRunMultiplePredecessors(self, jobGraph, jobNode, successorJobStoreID):
          
          # See implementation note at the top of this file for discussion of multiple predecessors
          logger.debug("Successor job: %s of job: %s has multiple "
                       "predecessors", jobNode, jobGraph)
  
          # Get the successor job graph, which is caches
          if successorJobStoreID not in self.toilState.jobsToBeScheduledWithMultiplePredecessors:
              self.toilState.jobsToBeScheduledWithMultiplePredecessors[successorJobStoreID] = self.jobStore.load(successorJobStoreID)
          successorJobGraph = self.toilState.jobsToBeScheduledWithMultiplePredecessors[successorJobStoreID]
  
          # Add the jobGraph as a finished predecessor to the successor
          successorJobGraph.predecessorsFinished.add(jobGraph.jobStoreID)
  
          # If the successor is in the set of successors of failed jobs
          if successorJobStoreID in self.toilState.failedSuccessors:
              if not self._handledFailedSuccessor(jobNode, jobGraph, successorJobStoreID):
                  return False
  
          # If the successor job's predecessors have all not all completed then
          # ignore the jobGraph as is not yet ready to run
          assert len(successorJobGraph.predecessorsFinished) <= successorJobGraph.predecessorNumber
          if len(successorJobGraph.predecessorsFinished) < successorJobGraph.predecessorNumber:
              return False
          else:
              # Remove the successor job from the cache
              self.toilState.jobsToBeScheduledWithMultiplePredecessors.pop(successorJobStoreID)
              return True
docs: Handle the special cases of checking if a successor job is
          ready to run when there are multiple predecessors