code: def print_summary(self):
      import psutil
  
      time_passed = datetime.datetime.utcnow() - self.start_time
      get_console().rule()
      for output in self.outputs:
          self.print_single_progress(output)
      get_console().rule(
          title=f"Time passed: {nice_timedelta(time_passed)}"
      )
      if self.debug_resources:
          get_console().print(
              get_single_tuple_array(
                  "Virtual memory", psutil.virtual_memory()
              )
          )
          disk_stats = []
          for partition in psutil.disk_partitions(all=True):
              if partition.fstype not in IGNORED_FSTYPES:
                  try:
                      disk_stats.append(
                          (
                              partition,
                              psutil.disk_usage(partition.mountpoint),
                          )
                      )
                  except Exception:
                      get_console().print(
                          f"No disk usage info for {partition.mountpoint}"
                      )
          get_console().print(
              get_multi_tuple_array("Disk usage", disk_stats)
          )
  
imports: from __future__ import annotations
  import datetime
  import os
  import re
  import sys
  import textwrap
  import time
  from abc import ABCMeta, abstractmethod
  from contextlib import contextmanager
  from enum import Enum
  from multiprocessing.pool import ApplyResult, Pool
  from pathlib import Path
  from tempfile import NamedTemporaryFile
  from threading import Thread
  from typing import Any, Generator, NamedTuple
  from rich.table import Table
  from airflow_breeze.utils.console import MessageType, Output, get_console
  from airflow_breeze.utils.shared_options import get_dry_run, get_forced_answer, get_verbose, set_dry_run, set_forced_answer, set_verbose
label_desc: Use image node_id 3 for calling the ParallelMonitor obj's underlying member method code with example usage: obj.print_summary() without return types