पायथन में डिबग मल्टीप्रोसेसिंग


15

पायथन में मल्टीप्रोसेसिंग प्रोग्राम डिबगिंग में कुछ अच्छे अभ्यास क्या हैं?

जवाबों:


6

पायथन कार्यक्रमों का सच बहुसंकेतन (बहु- पिरोया पायथन कार्यक्रमों के लिए जो खूंखार जीआईएल से निपटना है ) किसी भी अन्य भाषा में उन लोगों से अलग नहीं हैं। वे सभी एक ही बुनियादी चुनौतियां हैं:

  1. टास्क असाइनमेंट और परिणाम रिपोर्टिंग। यहां तक ​​कि अगर वे ज्यादातर स्वतंत्र डेटासेट पर काम कर रहे हैं, तो उन्हें आम तौर पर परिणामों की रिपोर्ट करने और काम करने के लिए नए डेटा प्राप्त करने के लिए मास्टर थ्रेड पर वापस जाना होगा । यह एक चोक पॉइंट हो सकता है।
  2. दौर कि शर्ते। प्रक्रियाएं एक-एक-समय संसाधन का उपयोग करने की कोशिश कर रही हैं और उन्हें एक-दूसरे के डेटा पर कदम रखने से रखने के लिए म्यूटेक्स (या कुछ इसी तरह) का उपयोग करने की आवश्यकता है। संसाधनों की इन प्रकार की रक्षा करने में विफलता वास्तव में, को जन्म दे सकता वास्तव में दर्दनाक डिबग सत्र।
  3. श्रृंखलामयता। कभी-कभी आप कुछ समानांतर बनाने की कोशिश कर रहे हैं जो नहीं है। विभिन्न प्रक्रियाएं कुछ करने के लिए एक-दूसरे का इंतजार खत्म करती हैं और अंतिम परिणाम यह है कि आपके पास, सभी इरादों और उद्देश्यों के लिए, एक क्रमिक कार्यक्रम लिया जाता है, इसे समानांतर बनाया जाता है, और यह अभी भी रैखिक समय (या बदतर) में निष्पादित होता है।

हालांकि ऐसी विकास विधियां हैं जो इन समस्याओं में से प्रत्येक से बचने की कोशिश करती हैं, दिन के अंत में आपको वास्तव में यह सोचने की जरूरत है कि आप क्या कर रहे हैं। मैं भारी तनाव परीक्षण की सिफारिश करता हूं - आपके द्वारा वास्तविक जीवन में हो सकने वाली किसी भी चीज से परे - ताकि आपके पास उन विंडोज ऑफ ऑपर्चुनिटी को मारने और विकास में एक प्रमुख डेमो के बीच में या उत्पादन के दौरान उड़ाने का एक अच्छा मौका हो।

हम माइक्रोसेकंड-टाइमस्टैंप लॉग फ़ाइलों का उपयोग करते थे और इसलिए हम कर सकता है तो एक रंग कोडित लॉग देखने एप्लिकेशन बनाया कोशिश कल्पना करने के लिए क्या एन प्रक्रिया के बीच हो रहा था एम प्रोसेसर पर चल रहा है। हमने एक सिस्टम बनाने की भी कोशिश की (और ज्यादातर सफल) जो क्रैश के संदर्भ को फिर से बनाने के लिए लॉग फाइल को बंद कर देगा।

लेकिन सबसे अच्छा उपकरण अच्छा डिज़ाइन और वास्तव में दुष्ट, बुरा लोग हैं जो आपके ऐप को पानी से बाहर निकालने की कोशिश करते हैं। (हाय, डबेल!)


26

एक चीज जो मुझे बहुत उपयोगी लगती है, वह है कि multiprocessingमॉड्यूल में मौजूदा लकड़हारा का उपयोग करना । इसे अपने मुख्य कोड में आज़माएं:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

इसे भी देखें: http://docs.python.org/library/multiprocessing.html#log

इसके अतिरिक्त, आप वर्तमान प्रक्रिया नाम का उपयोग कर सकते हैं:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

देखें: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

इसके अलावा मुझे मानक डिबगिंग विधियों जैसे pdb& co के अलावा और कुछ नहीं पता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.