2012-01-01 10 views
14

क्लोजर प्रोग्राम मुख्य कार्य में अंतिम कथन को खत्म करने के तुरंत बाद बाहर निकलने का कारण नहीं होगा?क्लोजर प्रोग्राम अंतिम वक्तव्य समाप्त करते समय बाहर नहीं निकल रहा है?

मैंने बस (doall (map ...)) को (doall (pmap ...)) में बदलना था, और अचानक कार्यक्रम बाहर निकलने से पहले सेकंड की अच्छी संख्या के लिए अपने कार्यों को पूरा करने पर लटका होगा। मैं -main फ़ंक्शन की अंतिम पंक्ति पर (println "Finished everything!") डालूंगा, और यह प्रिंट करेगा, फिर भी कुछ समय के लिए बाहर नहीं निकलता है। इस व्यवहार का कारण क्या हो सकता है, और मुझे इसे कैसे ठीक करना चाहिए?

संपादित करें: पीएमएपी प्रोग्राम का एकमात्र हिस्सा है जो समानांतर है (अधिकतर क्योंकि सब कुछ तुरंत या कम चलता है)। कार्यक्रम के बाद के हिस्सों के रूप में सही ढंग से कार्य करने के लिए pmap से सभी परिणामों की आवश्यकता होती है, और जैसे ही प्रोग्राम आउटपुट मानचित्र और pmap दोनों के लिए समान है, मुझे कुछ हद तक संदेह है कि कार्यक्रम के अंत में pmap अभी भी चल रहा है। Println के बजाय अंत में (System/exit 0) डालकर प्रोग्राम आउटपुट नहीं बदलता है।

+1

मुझे लगता है कि चाहते हैं कि pmap पूरी तरह से अपने प्रसंस्करण कर रही है जब कोड यह आग के बाद नहीं किया जाना चाहिए। बिना किसी कोड के बताना मुश्किल है। –

+1

संभावित डुप्लिकेट [क्लोजर मेरी गणना करने के बाद क्यों लटका है?] (Http://stackoverflow.com/questions/2622750/why-does-clojure-hang-after-having-performed-my-calculations) – amalloy

उत्तर

15

pmap आपके समवर्ती कार्यों की सेवा के लिए थ्रेडपूल से एकाधिक धागे को स्पिन करेगा।

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

आपको उन्हें स्पष्ट रूप से बंद करने के लिए स्पष्ट रूप से बताना होगा (लेकिन केवल जब आपका प्रोग्राम किया जाता है)। ऐसा लगता है कि here से पहले इसका उत्तर दिया गया है।

है कि इसका जवाब से हवाला देते हुए:

"। आप धागे pmap द्वारा प्रयोग किया जाता ThreadPool समर्थन को मारने के लिए shutdown-agents कॉल करने की आवश्यकता"

डॉक्स यहां हैं: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents

+0

ग्रेट सॉल्यूशन! मैंने इस समस्या को कई परियोजनाओं में चलाया है जहां मैं अन्य आदेश चलाने के लिए खोलता हूं, और '(शटडाउन-एजेंट)' को जोड़ता हूं। संभवत: 'clojure.java.shell' अपनी चीज करने के लिए किसी अन्य प्रकार के धागे का उपयोग कर रहा है। –

4

docs के अनुसार:

... [pmap है हे] कंप्यूटेशनल रूप से संवेदनशील कार्यों जहां च के समय हावी समन्वय भूमि के ऊपर के लिए केवल तभी उपयोगी है।

तो यह शायद मतलब है अधिक map का उपयोग करने से अपने परिदृश्य के लिए pmap का उपयोग कर भूमि के ऊपर नहीं है। pmap आग के बाद कोड से पहले समाप्त होने के लिए pmap ऑपरेशंस शायद थोड़ा अतिरिक्त समय ले रहे हैं।

+0

मैं नहीं करता दिमागी कम मत होने पर, लेकिन कम से कम एक स्पष्टीकरण दें। –

+0

जेसन के जवाब के लिए धन्यवाद, लेकिन मुझे संदेह है कि pmap ने प्रश्नों में जोड़े गए कारणों के लिए अपने परिचालन को समाप्त नहीं किया है। क्या आपके पास इस व्यवहार के लिए कोई अन्य विचार होगा? इसके अलावा, बस fyi, मैंने तुम्हें कम नहीं किया था। – wrongusername

+0

@wrongusername: कोई अन्य सुझाव नहीं। और स्कॉट लोवे द्वारा प्रदान किए गए उत्तर के लिए धन्यवाद, इसकी कोई ज़रूरत नहीं है। –

संबंधित मुद्दे