code: def submit_background_work_chain(self, work_chain, parent_workunit_name=None):
      
      background_root_workunit = self.run_tracker.get_background_root_workunit()
      if parent_workunit_name:
        # We have to keep this workunit alive until all its child work is done, so
        # we manipulate the context manually instead of using it as a contextmanager.
        # This is slightly funky, but the with-context usage is so pervasive and
        # useful elsewhere that it's worth the funkiness in this one place.
        workunit_parent_ctx = self.run_tracker.new_workunit_under_parent(
          name=parent_workunit_name, labels=[WorkUnitLabel.MULTITOOL], parent=background_root_workunit)
        workunit_parent = workunit_parent_ctx.__enter__()
        done_hook = lambda: workunit_parent_ctx.__exit__(None, None, None)
      else:
        workunit_parent = background_root_workunit  # Run directly under the root.
        done_hook = None
      self.run_tracker.background_worker_pool().submit_async_work_chain(
        work_chain, workunit_parent=workunit_parent, done_hook=done_hook)
docs: :API: public