docstr: Cleanup all the remaining objects. This is called automatically
  when the program exits.
  It also blocks until all the cleanup functions have finished to ensure
  data consistency.
docstr_tok: ["Cleanup","all","the","remaining","objects",".","This","is","called","automatically","when","the","program","exits",".","It","also","blocks","until","all","the","cleanup","functions","have","finished","to","ensure","data","consistency","."]
code: def cleanup():
      """
      Cleanup all the remaining objects. This is called automatically
      when the program exits.
      It also blocks until all the cleanup functions have finished to ensure
      data consistency.
      """
      logger.debug("Cleaning up...  Blocking KeyboardInterrupts")
      example = RobustExec(
          stop_signal=AutoClean.stop_signal, target=AutoClean._cleanup
      )
      example.start()
      example.join()
      logger.debug("Cleaning up...  Done")
  
file_path: aim/aim/ext/cleanup/__init__.py
imports: import time
  from abc import abstractmethod
  import atexit
  import weakref
  import logging
  import threading
  from typing import Generic, Tuple, TypeVar, Dict
label_desc: Use image node_id 5 for calling the AutoClean obj's underlying member method code with example usage: obj.cleanup() without return types