docs: def end_task_type(self, task_type_str):
          """Call when processing of all tasks of the given type is completed, typically
          just after exiting a loop that processes many tasks of the given type.
  
          Progress messages logged at intervals will typically not include the final entry
          which shows that processing is 100% complete, so a final progress message is
          logged here.
  
          """
          assert (
              task_type_str in self._task_dict
          ), "Task type has not been started yet: {}".format(task_type_str)
          self._log_progress()
          del self._task_dict[task_type_str]