class_docstr: Python TaskScheduler object.
  
  This is the simplest object that supports msg_id based
  DAG dependencies. *Only* task msg_ids are checked, not
  msg_ids of jobs submitted via the MUX queue.
class_docstr_tok: ["Python","TaskScheduler","object",".","This","is","the","simplest","object","that","supports","msg_id","based","DAG","dependencies",".","*","Only","*","task","msg_ids","are","checked",",","not","msg_ids","of","jobs","submitted","via","the","MUX","queue","."]
docstr: Save a message for later submission when its dependencies are met.
docstr_tok: ["Save","a","message","for","later","submission","when","its","dependencies","are","met","."]
code: def save_unmet(self, job):
      """Save a message for later submission when its dependencies are met."""
      msg_id = job.msg_id
      self.log.debug("Adding task %s to the queue", msg_id)
      self.queue_map[msg_id] = job
      self.queue.append(job)
      # track the ids in follow or after, but not those already finished
      for dep_id in job.after.union(job.follow).difference(
          self.all_done
      ):
          if dep_id not in self.graph:
              self.graph[dep_id] = set()
          self.graph[dep_id].add(msg_id)
  
      # schedule timeout callback
      if job.timeout:
          timeout_id = job.timeout_id = job.timeout_id + 1
          self.loop.add_timeout(
              time.time() + job.timeout,
              lambda: self.job_timeout(job, timeout_id),
          )
  
imports: import time
  from collections import deque
  from random import randint, random
  from types import FunctionType
  import zmq
  from traitlets import Dict, Enum, Instance, Integer, List, observe
  from ipyparallel import Dependency, error, util
  from ipyparallel.controller.scheduler import Scheduler
label_desc: Use image node_id 15 for calling the TaskScheduler obj's underlying member method code with example usage: obj.save_unmet(job) without return types