मान लीजिए कि मैंने मुख्य प्रक्रिया में लॉगिंग हैंडलर को कॉन्फ़िगर किया है। मुख्य प्रक्रिया कुछ बच्चों को जन्म देती है और os.fork()
(लिनक्स में) के कारण सभी लॉगर्स और हैंडलर मुख्य प्रक्रिया से विरासत में प्राप्त होते हैं।फोर्क पर आधारित मल्टीप्रोसेसिंग के दौरान मैं अजगर लॉगर्स और हैंडलर की विरासत को कैसे रोक सकता हूं?
import multiprocessing as mp
import logging
def do_log(no):
# root logger logs Hello World to stderr (StreamHandler)
# BUT I DON'T WANT THAT!
logging.getLogger().info('Hello world {}'.format(no))
def main():
format = '%(processName)-10s %(name)s %(levelname)-8s %(message)s'
# This creates a StreamHandler
logging.basicConfig(format=format, level=logging.INFO)
n_cores = 4
pool = mp.Pool(n_cores)
# Log to stdout 100 times concurrently
pool.map(do_log, range(100))
pool.close()
pool.join()
if __name__ == '__main__':
main()
इस तरह कुछ प्रिंट होगा: 'Hello World'
नीचे दिए गए उदाहरण में कंसोल के लिए 100 बार मुद्रित किया जाएगा
ForkPoolWorker-1 root INFO Hello world 0
ForkPoolWorker-3 root INFO Hello world 14
ForkPoolWorker-3 root INFO Hello world 15
ForkPoolWorker-3 root INFO Hello world 16
...
हालांकि, मैं बच्चे प्रक्रिया सभी लॉगिंग विन्यास के वारिस नहीं करना चाहते माता-पिता से तो do_log
से ऊपर के उदाहरण में stderr
पर कुछ भी प्रिंट नहीं करना चाहिए क्योंकि StreamHandler
नहीं होना चाहिए।
मैं मूल अभिभावक प्रक्रिया में उन्हें हटाने या हटाने के बिना लॉगर्स और हैंडलर को विरासत में कैसे रोकूं?
संपादित करें: यह एक अच्छा विचार बस पूल के प्रारंभ में सभी संचालकों को दूर करने के होगा?
def init_logging():
for logger in logging.Logger.manager.loggerDict.values():
if hasattr(logger, 'handlers'):
logger.handlers = []
और
pool = mp.Pool(n_cores, initializer=init_logging, initargs=())
इसके अलावा
, मैं भी सुरक्षित रूप से close()
सब (फाइल) प्रारंभ समारोह के दौरान संचालकों कर सकते हैं?
'multiprocessing.Pool' में प्रारंभिक फ़ंक्शन है जिसे बच्चे में बुलाया जाता है लेकिन मुझे नहीं पता कि यह बिना किसी गंदे हैक के सभी लॉगिंग हैंडलर को कैसे बंद कर सकता है। – tdelaney
क्या मैं बस 'logging.shutdown() कह सकता हूं; logging.Logger.manager.loggerDict = {} 'प्रारंभकर्ता में? या क्या मैं बाद में बनाए गए नए हैंडलरों में हस्तक्षेप करूंगा? या हैकी करने के लिए हो? – SmCaterpillar
इसका उपयोग अनुप्रयोग निकास पर किया जाना चाहिए, इसलिए मैं इसे एक अच्छा समाधान होने की उम्मीद नहीं करता। यह किसी भी बफर को भी फ्लश करता है जो एक बुरी चीज होगी (फ़ाइल लॉगर की कल्पना करें)। असल में, मुझे हैरान है कि मैंने खुद को इस समस्या में नहीं फेंक दिया है ... मैं प्रतिक्रियाओं की प्रतीक्षा कर रहा हूं। लॉगिंग में जोड़ने के लिए यह एक अच्छी नई सुविधा हो सकती है। – tdelaney