Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

util.py 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #
  2. # Module providing various facilities to other parts of the package
  3. #
  4. # billiard/util.py
  5. #
  6. # Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
  7. # Licensed to PSF under a Contributor Agreement.
  8. #
  9. from __future__ import absolute_import
  10. import errno
  11. import functools
  12. import atexit
  13. from multiprocessing.util import ( # noqa
  14. _afterfork_registry,
  15. _afterfork_counter,
  16. _exit_function,
  17. _finalizer_registry,
  18. _finalizer_counter,
  19. Finalize,
  20. ForkAwareLocal,
  21. ForkAwareThreadLock,
  22. get_temp_dir,
  23. is_exiting,
  24. register_after_fork,
  25. _run_after_forkers,
  26. _run_finalizers,
  27. )
  28. from .compat import get_errno
  29. __all__ = [
  30. 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger',
  31. 'log_to_stderr', 'get_temp_dir', 'register_after_fork',
  32. 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal',
  33. 'SUBDEBUG', 'SUBWARNING',
  34. ]
  35. #
  36. # Logging
  37. #
  38. NOTSET = 0
  39. SUBDEBUG = 5
  40. DEBUG = 10
  41. INFO = 20
  42. SUBWARNING = 25
  43. ERROR = 40
  44. LOGGER_NAME = 'multiprocessing'
  45. DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s'
  46. _logger = None
  47. _log_to_stderr = False
  48. def sub_debug(msg, *args, **kwargs):
  49. if _logger:
  50. _logger.log(SUBDEBUG, msg, *args, **kwargs)
  51. def debug(msg, *args, **kwargs):
  52. if _logger:
  53. _logger.log(DEBUG, msg, *args, **kwargs)
  54. return True
  55. return False
  56. def info(msg, *args, **kwargs):
  57. if _logger:
  58. _logger.log(INFO, msg, *args, **kwargs)
  59. return True
  60. return False
  61. def sub_warning(msg, *args, **kwargs):
  62. if _logger:
  63. _logger.log(SUBWARNING, msg, *args, **kwargs)
  64. return True
  65. return False
  66. def error(msg, *args, **kwargs):
  67. if _logger:
  68. _logger.log(ERROR, msg, *args, **kwargs)
  69. return True
  70. return False
  71. def get_logger():
  72. '''
  73. Returns logger used by multiprocessing
  74. '''
  75. global _logger
  76. import logging
  77. logging._acquireLock()
  78. try:
  79. if not _logger:
  80. _logger = logging.getLogger(LOGGER_NAME)
  81. _logger.propagate = 0
  82. logging.addLevelName(SUBDEBUG, 'SUBDEBUG')
  83. logging.addLevelName(SUBWARNING, 'SUBWARNING')
  84. # XXX multiprocessing should cleanup before logging
  85. if hasattr(atexit, 'unregister'):
  86. atexit.unregister(_exit_function)
  87. atexit.register(_exit_function)
  88. else:
  89. atexit._exithandlers.remove((_exit_function, (), {}))
  90. atexit._exithandlers.append((_exit_function, (), {}))
  91. finally:
  92. logging._releaseLock()
  93. return _logger
  94. def log_to_stderr(level=None):
  95. '''
  96. Turn on logging and add a handler which prints to stderr
  97. '''
  98. global _log_to_stderr
  99. import logging
  100. logger = get_logger()
  101. formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT)
  102. handler = logging.StreamHandler()
  103. handler.setFormatter(formatter)
  104. logger.addHandler(handler)
  105. if level:
  106. logger.setLevel(level)
  107. _log_to_stderr = True
  108. return _logger
  109. def _eintr_retry(func):
  110. '''
  111. Automatic retry after EINTR.
  112. '''
  113. @functools.wraps(func)
  114. def wrapped(*args, **kwargs):
  115. while 1:
  116. try:
  117. return func(*args, **kwargs)
  118. except OSError as exc:
  119. if get_errno(exc) != errno.EINTR:
  120. raise
  121. return wrapped