2012-04-20 33 views
5

प्रतिक्रियाएँकुछ "संभावित जवाब" करने के लिए हत्या जावा में अनंत लूप्स/Clojure

  • आप "बीच में आता है" छिड़क चाहिए अपने धागे

    में मैं इसे किया जा रहा करने के इरादे से मेरी कोड नहीं लिखते एक लंबी प्रक्रिया/अनंत लूप; यह सिर्फ विकास में है, मैं दुर्घटनाग्रस्त कोड लिखना जो असीमित लूप होता है, इस प्रकार मैं कोड में "धागा बाधित होने की जांच" करने के लिए पहले से योजना नहीं बना सकता।

प्रश्न:

जैसा कि मैंने जावा/Clojure/स्वांक और वृद्धिशील कोड विकास के साथ अधिक परिचित होने के। मुझे लगता है कि मेरे लिए गलती से एक क्लोजर फ़ंक्शन लिखना बहुत आसान लगता है जो एक अनंत लूप बनता है - और इसे चलाता है। यह आगे बढ़ता है, और जेवीएम को खींचता है, जिसके कारण मेरे लैपटॉप पर प्रशंसकों को स्पिन किया जाता है - और मूल रूप से, मुझे सिर्फ एक रन दूर थ्रेड से छुटकारा पाने के लिए पूरे जेवीएम को मारना पड़ता है।

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

धन्यवाद!

+0

आपको एक परिभाषा के लिए आना होगा कि एक अनंत लूप पहले क्या है। – Aidanc

+0

(println (रेंज)) एक अनंत लूप है। –

+0

यह एक उदाहरण है, परिभाषा नहीं – Jasper

उत्तर

7

मुझे नहीं लगता कि एक पूरी तरह से पूरा जवाब मौजूद है, करते हैं, हालांकि ऐसा करने के लिए कुछ अधूरा है लेकिन अभी भी उपयोगी चीजें हैं:

  • सबसे पहले मैं repl जो अग्रभूमि धागा जिनमें से 99% हो जाता है मारता है से ctrl-c ctrl-c मारा मेरी सामान्य गलतियों
  • फिर यदि यह विफल रहता है तो मैं टर्मिनल और kill कमांड के लिए जाता हूं।
  • के बाद कि इसके M-x slime-quit-lisp, clojure-jack-in
+0

यह सही नहीं है, लेकिन यह उतना ही अच्छा है जितना मेरा मानना ​​है कि व्यावहारिक होगा। –

+0

चूंकि इसे पोस्ट किया गया था, इसलिए स्लिम कमांड साइडर में बदल दिए गए थे, अब यह –

0

सैद्धांतिक रूप से, के रूप में टिप्पणी में उल्लेख किया है, यह एक बहुत ही कठिन समस्या वास्तव में हल करने के लिए है।

एक व्यावहारिक समाधान के लिए सबसे अच्छा आशा ...

मैं यहाँ है कि आप की मौत हो गई और clojure धागे जो चल रहे हैं में विश्लेषण गतिविधि का एक और अधिक विश्वसनीय और सुरक्षित तरीके से चाहते हैं यह सोचते हैं रहा हूँ। । । और इसके लिए, जेपीएस जाने का रास्ता है, क्योंकि जेपीएस सभी जावा प्रक्रियाओं पर नज़र रखता है, जिसमें आप मानक क्लोजर में कुछ भी करते हैं।

मैं हमेशा बात की इस तरह के लिए JPS उपयोग करें, क्योंकि यह प्रक्रिया वर्ग नामों सहित विशिष्ट जावा वर्गों के नाम दिखाने के लिए इस्तेमाल किया जा सकता ... वर्ग जो शुरू में एक प्रक्रिया लागू पता करने की क्षमता प्रदान करती है "क्या" वास्तव में हत्या का एक सुंदर सटीक विचार है।

doolittle-5:~ Jpeerindex$ jps -l 
61133 jline.ConsoleRunner 
58998 start.jar 
61161 sun.tools.jps.Jps 
51866 jline.ConsoleRunner 

इस मामले में, के बाद से "lein repl" (clojure repl) jline (मुख्य वर्ग ConsoleRunner जा रहा है) के माध्यम से शुरू कर दिया है, हम इस तरह के रूप में यह देख सकते हैं।

तुम सच में विवरण देखने के लिए की जरूरत है, तो आप इन प्रक्रियाओं का कोई भी ले सकते हैं और उन्हें jstack साथ कॉल कर सकते हैं:

$> jstack 51866

"गिरोह कार्यकर्ता # 0 (समांतर जीसी धागे) "prio = 9 टीआईडी ​​= 101,802,800 एनआईडी = 0x1017f9000 runnable

" गिरोह कार्यकर्ता # 1 (समानांतर जीसी धागे) "prio = 9 टीआईडी ​​= 101,803,800 एनआईडी = 0x102301000 runnable

"समवर्ती मार्क-स्वीप जीसी थ्रेड" prio = 9 टीआईडी ​​= 10184e000 एनआईडी = 0x1093f0000 runnable "वीएम समय-समय पर कार्य थ्रेड" prio = 10 टीआईडी ​​= 1018a4000 एनआईडी = 0x10a310000 शर्त पर इंतजार कर

"अपवाद कैचर थ्रेड" prio = 10 टीआईडी ​​= 101,802,000 एनआईडी = 0x100704000 runnable JNI वैश्विक संदर्भ: 137

इस मामले में, आप, मौसम के लिए है या नहीं आपकी धागे में किसी भी असली मुद्दे हैं परिचित होने के लिए, उन्हें ठीक पहचान में सक्षम हो जाएगा और आत्मविश्वास के साथ उन्हें मार डालो, आदि ...

2

cre के लिए एक मैक्रो लिखने के बारे में क्या इन लूपों को खा लिया और मैक्रो लूप चरणों में कोड को इंजेक्ट कर सकता है ताकि समय-समय पर लूप से बाहर निकलने के लिए इंगित किया जा सके, जैसे कि अस्थायी फ़ाइल/tmp पर मौजूद है। इसलिए मूल रूप से अनंत लूप से बाहर निकलने के लिए आपको उस अस्थायी फ़ाइल को बनाने की आवश्यकता होगी।

+0

में साइडर-जैक है, मुझे लगता है कि यह सबसे अच्छा समाधान है क्योंकि यह किसी भी विशेष विकास पर्यावरण पर निर्भर नहीं है। आप मानक clojure.core loop/recur को कस्टम वाले लोगों के साथ प्रतिस्थापित कर सकते हैं जो एक परमाणु की जांच करते हैं और/या लूप को सीमित करने के लिए अंतर्निहित काउंटर या टाइमर का उपयोग करते हैं और यह बंद होने पर वर्तमान लूप स्थिति जैसे डीबग जानकारी भी प्रदर्शित कर सकता है। – optevo

0

ग्रहण/काउंटरक्लॉक वार बीटा में आरईपीएल को रोकने के बिना मैन्युअल रूप से चलने (नियंत्रण से बाहर) धागे को रोकने का विकल्प होता है। मैं उस सुविधा को उसी कारण से प्यार करता हूं जिसके लिए आप इसे प्राप्त करना चाहते हैं।

यह एनआरईपीएल 0.2.0 बीटा का उपयोग करता है, मुझे लगता है कि clojure.tools.nrepl.middleware.interruptible-eval के माध्यम से। न केवल ग्रहण/सीसीडब्ल्यू एनआरईपीएल 0.2.0 क्लाइंट, बल्कि आरईपीएल-वाई का नवीनतम संस्करण भी इस फ़ंक्शन का समर्थन करना चाहिए (थ्रेड रोकने के लिए डिफ़ॉल्ट CTRL-C, REPL को रोकने के लिए CTRL-D)।