मेरे पास जावा बाइटकोड के कई उदाहरण हैं, जिनमें से सभी क्लोजर से निष्पादित करना चाहते हैं। बाइटकोड के प्रत्येक अनुक्रम में एक अनंत लूप हो सकता है, जिस स्थिति में मैं इसे कुछ सेकंड के बाद चलाना बंद करना चाहता हूं। मैं इसे करने के साधन के रूप में वायदा देख रहा हूं। मैं कोशिश की है कार्यान्वयन की एक जोड़ी दोनों इस कोड के लिए चारों ओर शिकार करने के बाद:रद्द किए गए क्लोजर वायदा सीपीयू का उपयोग जारी क्यों करते हैं?
(deref (future (loop[a 1] (recur a)) :done!) 1000 :impatient!)
... और भी https://gist.github.com/3124000
दोनों ही मामलों में कम से कोड, पाश उचित रूप से समय समाप्त हो गया प्रतीत होता है (और बाद के मामले में भविष्य दोनों को किया और रद्द कर दिया गया है), लेकिन मुझे लगता है कि मेरा सीपीयू उपयोग 99% या उससे ऊपर तक बढ़ता है और वहां रहता है। मैं यह भी देखता हूं कि हर बार जब मैं इस कोड को चलाता हूं, तो मेरी जावा प्रक्रिया में अतिरिक्त थ्रेड प्राप्त होता है।
ऐसा लगता है कि भविष्य को रद्द कर दिया जा रहा है, लेकिन कोड अभी भी चल रहा है। मेरे कार्यक्रम में मुझे कुछ बहुत सख्त अनंत लूप (जैसे कि "20 प्रिंट गोटो 10" के बराबर जावा बाइटकोड) चलाने और समय निकालने की आवश्यकता होगी और मेरे पास जो कोड चल रहा है उसे संशोधित करने का विकल्प नहीं है।
कोई विचार क्यों मैं इस व्यवहार को देख रहा हूं; इसे रोकने के लिए मैं क्या कर सकता था; या इस तरह के कोड चलाने और समय के अपने लक्ष्य को समझने के लिए मेरे लिए वैकल्पिक तरीकों?
यह वास्तव में उपयोगी लगता है, लेकिन जब मैं करता हूं (थंक-टाइमआउट (लूप [ए 0] (पुनरारंभ ए)) 10000) फ़ंक्शन बस लटकता है और सीपीयू ऊपर जाता है ... 10000ms के बाद भी कोई टाइमआउट नहीं। कोई विचार? –
मैंने जल्द ही बात की; जब मैं थ्रेड ग्रुप बनाता हूं और इसे अपने थंक-टाइमआउट में पास करता हूं, तो आवर्ती फ़ंक्शन वास्तव में बंद हो जाता है। धन्यवाद :) –
थ्रेड ग्रुप की आवश्यकता क्यों है, बस इसे एफएन में लपेटें पर्याप्त है :) (थंक-टाइमआउट (एफएन [] (लूप [ए 0] (रिकर ए)) 10000)) – o0omycomputero0o