1 r"""Utility classes & functions for data loading. Code in this folder is mostly 2 used by ../dataloder.py. 4 A lot of multiprocessing is used in data loading, which only supports running 5 functions defined in global environment (py2 can't serialize static methods). 6 Therefore, for code tidiness we put these functions into different files in this 15 IS_WINDOWS = sys.platform ==
"win32" 28 r"""Wraps an exception plus traceback to communicate across threads""" 29 def __init__(self, exc_info):
33 self.
exc_msg =
"".join(traceback.format_exception(*exc_info))
36 MP_STATUS_CHECK_INTERVAL = 5.0
37 r"""Interval (in seconds) to check status of processes to avoid hanging in 38 multiprocessing data loading. This is mainly used in getting data from 39 another process, in which case we need to periodically check whether the 40 sender is alive to prevent hanging.""" 43 python_exit_status =
False 44 r"""Whether Python is shutting down. This flag is guaranteed to be set before 45 the Python core library resources are freed, but Python may already be exiting 46 for some time when this is set. 48 Hook to set this flag is `_set_python_exit_flag`, and is inspired by a similar 49 hook in Python 3.7 multiprocessing library: 50 https://github.com/python/cpython/blob/d4d60134b29290049e28df54f23493de4f1824b6/Lib/multiprocessing/util.py#L277-L327 54 def _set_python_exit_flag():
55 global python_exit_status
56 python_exit_status =
True 58 atexit.register(_set_python_exit_flag)
61 from .
import worker, signal_handling, pin_memory, collate