2011-03-13 10 views
15

कुछ साझा किए गए रेफरी के अपडेट करने और अपने जीवनकाल को प्रबंधित करने के लिए पृष्ठभूमि में लूप को थ्रेड बनाने के लिए मूर्खतापूर्ण क्लोजर तरीका क्या है? मैं अपने लिए future का उपयोग कर पाता हूं, लेकिन यह एक हैक की तरह लगता है क्योंकि मैं कभी भी सार्थक मूल्य नहीं देता हूं। उदा .:पृष्ठभूमि धागे को स्पैन और प्रबंधित करने के लिए इडियोमैटिक क्लोजर तरीका

(future (loop [] (do 
    (Thread/sleep 100) 
    (dosync (...)) 
    (recur)))) 

इसके अलावा, मैं पृष्ठभूमि प्रसंस्करण अब जरूरत है, जब future-cancel यह करने के लिए सावधान रहने की जरूरत है। क्लोजर/स्विंग एप्लिकेशन में ऑर्केस्ट्रेट करने के तरीके पर कोई सुझाव अच्छा होगा। जैसे एक डमी JComponent जो मेरे यूआई में जोड़ा गया है जो खिड़की बंद होने पर थ्रेड को मारने के लिए ज़िम्मेदार है, यह एक विचार हो सकता है।

उत्तर

8

आपको अपने लूप में do की आवश्यकता नहीं है; यह निहित है। साथ ही, बिना शर्त लूप-रिकर के साथ कुछ भी गलत नहीं है, आप भी उपयोग कर सकते हैं (जबकि सच ...)।

future इसके लिए एक अच्छा उपकरण है; इसे आपको परेशान न करने दें कि आपको कभी भी मूल्य वापस नहीं मिलता है। वास्तव में आपको परेशान कर सकता है यदि आप भविष्य के बजाय एजेंट का उपयोग करते हैं, हालांकि - मूल्यों के बिना एजेंट पागलपन हैं।

हालांकि, किसने कहा कि आपको future-cancel की आवश्यकता है? अपने भविष्य में केवल एक कदम यह जांचने के लिए करें कि इसकी अभी भी आवश्यकता है या नहीं। फिर आपके कोड के किसी अन्य भाग को वायदा का ट्रैक रखने और उन्हें रद्द करने का निर्णय लेने की आवश्यकता नहीं है। तो

(future (loop [] 
      (Thread/sleep 100) 
      (when (dosync 
       (alter some-value some-function)) 
      (recur)) ; quit if alter returns nil 
     )) 

कुछ व्यवहार्य दृष्टिकोण होगा।

+0

कॉलिंग 'भविष्य cancel' या वास्तव में एक ही बात करने के लिए एक" कृपया रहने दें "झंडा राशि की स्थापना:

इस तरह कैसे रिच हिक्की चींटी कॉलोनी उदाहरण अनुप्रयोग में आवर्ती कार्य करता है। मुझे अभी भी यह सुनिश्चित करने की ज़रूरत है कि यह सही समय पर और मजबूत रूप से ऐसा होता है। (मुझे आरएआईआई याद आती है) – pauldoo

+0

'डू' और 'जबकि' के बारे में आपके अन्य बिंदु बिल्कुल सही हैं। :) – pauldoo

+0

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

-1

पृष्ठभूमि आवर्ती कार्यों के लिए एजेंट का उपयोग करना मेरे लिए neater लगता

(def my-ref (ref 0)) 

(def my-agent (agent nil)) 

(defn my-background-task [x] 
    (do 
    (send-off *agent* my-background-task) 
    (println (str "Before " @my-ref)) 
    (dosync (alter my-ref inc)) 
    (println "After " @my-ref) 
    (Thread/sleep 1000))) 

अब तुम सब करने की है पाश

(send-off my-agent my-background-task) 

my-backgound-task समारोह के बाद फोन करने एजेंट को ही भेज रहा है आरंभ करने के लिए है इसका आविष्कार किया जाता है। Clojure Concurrency

+0

एक बहुत बुरा विचार है। चींटी कॉलोनी प्री क्लोजर 1.0 था। उसने केवल ऐसा ही किया क्योंकि वहां कोई वायदा नहीं है। – nickik

+3

आपको क्यों लगता है कि यह एक बुरा विचार है? – Maciej

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