docs: def start_task_type(self, task_type_str, total_task_count):
          """Call when about to start processing a new type of task, typically just before
          entering a loop that processes many task of the given type.
  
          Args:
              task_type_str (str):
                  The name of the task, used as a dict key and printed in the progress
                  updates.
  
              total_task_count (int):
                  The total number of the new type of task that will be processed.
  
          This starts the timer that is used for providing an ETA for completing all tasks
          of the given type.
  
          The task type is included in progress updates until end_task_type() is called.
  
          """
          assert (
              task_type_str not in self._task_dict
          ), "Task type has already been started"
          self._task_dict[task_type_str] = {
              "start_time": time.time(),
              "total_task_count": total_task_count,
              "task_idx": 0,
          }