पायथन के मल्टीप्रोसेसिंग मॉड्यूल में, पूल क्लास कई प्रक्रियाओं में कार्यों को वितरित करने का एक सुविधाजनक तरीका प्रदान करता है। हालाँकि, पूल में कीबोर्डइंटरप्ट इवेंट को संभालना चुनौतीपूर्ण हो सकता है, जैसा कि कोड स्निपेट द्वारा प्रदर्शित किया गया है:
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)
यह वर्कअराउंड मल्टीप्रोसेसिंग पूल में कीबोर्डइंटरप्ट इवेंट को शानदार ढंग से संभालने का एक तरीका प्रदान करता है, जिससे उपयोगकर्ता द्वारा प्रोग्राम रद्द करने पर सभी उपप्रक्रियाओं को समाप्त करने की अनुमति मिलती है। .
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3