class_docstr: Base class to build BackgroundJob classes.
  
  The derived classes must implement:
  
  - Their own __init__, since the one here raises NotImplementedError.  The
    derived constructor must call self._init() at the end, to provide common
    initialization.
  
  - A strform attribute used in calls to __str__.
  
  - A call() method, which will make the actual execution call and must
    return a value to be held in the 'result' field of the job object.
class_docstr_tok: ["Base","class","to","build","BackgroundJob","classes",".","The","derived","classes","must","implement",":","-","Their","own","__init__",",","since","the","one","here","raises","NotImplementedError",".","The","derived","constructor","must","call","self._init","(",")","at","the","end",",","to","provide","common","initialization",".","-","A","strform","attribute","used","in","calls","to","__str__",".","-","A","call","(",")","method",",","which","will","make","the","actual","execution","call","and","must","return","a","value","to","be","held","in","the","'result","'","field","of","the","job","object","."]
docstr: Common initialization for all BackgroundJob objects
docstr_tok: ["Common","initialization","for","all","BackgroundJob","objects"]
code: def _init(self):
      """Common initialization for all BackgroundJob objects"""
  
      for attr in ["call", "strform"]:
          assert hasattr(self, attr), "Missing attribute <%s>" % attr
  
      # The num tag can be set by an external job manager
      self.num = None
  
      self.status = BackgroundJobBase.stat_created
      self.stat_code = BackgroundJobBase.stat_created_c
      self.finished = False
      self.result = "<BackgroundJob has not completed>"
  
      # reuse the ipython traceback handler if we can get to it, otherwise
      # make a new one
      try:
          make_tb = get_ipython().InteractiveTB.text
      except:
          make_tb = AutoFormattedTB(
              mode="Context", color_scheme="NoColor", tb_offset=1
          ).text
      # Note that the actual API for text() requires the three args to be
      # passed in, so we wrap it in a simple lambda.
      self._make_tb = lambda: make_tb(None, None, None)
  
      # Hold a formatted traceback if one is generated.
      self._tb = None
  
      threading.Thread.__init__(self)
  
imports: import sys
  import threading
  from IPython import get_ipython
  from IPython.core.ultratb import AutoFormattedTB
  from logging import error, debug
label_desc: Use image node_id 2 for calling the BackgroundJobBase obj's underlying member method code with example usage: obj._init() without return types