"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > पायथन के मल्टीप्रोसेसिंग पूल में कीबोर्ड व्यवधानों को कैसे संभालें?

पायथन के मल्टीप्रोसेसिंग पूल में कीबोर्ड व्यवधानों को कैसे संभालें?

2024-12-22 को प्रकाशित
ब्राउज़ करें:115

How to Handle Keyboard Interrupts in Python\'s Multiprocessing Pool?

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

पायथन के मल्टीप्रोसेसिंग मॉड्यूल में, पूल क्लास कई प्रक्रियाओं में कार्यों को वितरित करने का एक सुविधाजनक तरीका प्रदान करता है। हालाँकि, पूल में कीबोर्डइंटरप्ट इवेंट को संभालना चुनौतीपूर्ण हो सकता है, जैसा कि कोड स्निपेट द्वारा प्रदर्शित किया गया है:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

इस कोड को चलाते समय, Ctrl C दबाने से क्लीनअप प्रक्रिया शुरू नहीं होगी, जिससे उपप्रक्रियाएं अनिश्चित काल तक चलती रहेंगी। इस समस्या के समाधान के लिए, निम्नलिखित समाधान पर विचार करें:

कोड में देखा गया व्यवहार पायथन बग का परिणाम है। threading.Condition.wait() में किसी शर्त की प्रतीक्षा करते समय कीबोर्डइंटरप्ट नहीं भेजा जाता है। चूंकि Pool.map() आंतरिक रूप से प्रतीक्षा स्थिति का उपयोग करता है, इसलिए रुकावट कभी प्राप्त नहीं होती है।

एक समाधान Pool.map_async() का उपयोग करना है, जो एक टाइमआउट निर्दिष्ट करने की अनुमति देता है। पर्याप्त रूप से लंबा टाइमआउट सेट करके (उदाहरण के लिए, 9999999), हम यह सुनिश्चित कर सकते हैं कि व्यवधान उचित समय के भीतर शुरू हो जाएगा।

इसलिए, प्रतिस्थापित करें:

    results = pool.map(slowly_square, range(40))

के साथ:

    results = pool.map_async(slowly_square, range(40)).get(9999999)

यह वर्कअराउंड मल्टीप्रोसेसिंग पूल में कीबोर्डइंटरप्ट इवेंट को शानदार ढंग से संभालने का एक तरीका प्रदान करता है, जिससे उपयोगकर्ता द्वारा प्रोग्राम रद्द करने पर सभी उपप्रक्रियाओं को समाप्त करने की अनुमति मिलती है। .

विज्ञप्ति वक्तव्य यह आलेख यहां पुनर्मुद्रित है: 1729576640 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3