r"""Utility classes & functions for data loading. Code in this folder is mostly used by ../dataloder.py. A lot of multiprocessing is used in data loading, which only supports running functions defined in global environment (py2 can't serialize static methods). Therefore, for code tidiness we put these functions into different files in this folder. """ import sys import atexit # old private location of the ExceptionWrapper that some users rely on: from torch._utils import ExceptionWrapper IS_WINDOWS = sys.platform == "win32" MP_STATUS_CHECK_INTERVAL = 5.0 r"""Interval (in seconds) to check status of processes to avoid hanging in multiprocessing data loading. This is mainly used in getting data from another process, in which case we need to periodically check whether the sender is alive to prevent hanging.""" python_exit_status = False r"""Whether Python is shutting down. This flag is guaranteed to be set before the Python core library resources are freed, but Python may already be exiting for some time when this is set. Hook to set this flag is `_set_python_exit_flag`, and is inspired by a similar hook in Python 3.7 multiprocessing library: https://github.com/python/cpython/blob/d4d60134b29290049e28df54f23493de4f1824b6/Lib/multiprocessing/util.py#L277-L327 """ try: import numpy HAS_NUMPY = True except ModuleNotFoundError: HAS_NUMPY = False def _set_python_exit_flag(): global python_exit_status python_exit_status = True atexit.register(_set_python_exit_flag) from . import worker, signal_handling, pin_memory, collate, fetch