2011-08-14 27 views
6

मैं सिमुलेशन के साथ टकरा रहा हूं जहां मेरे पास कुछ रोबोट और नियंत्रक हैं, नियंत्रक ने फैसला किया है कि क्या करना है और रोबोट को नौकरियां सौंपना है, तकनीकी रूप से दुर्व्यवहार मूल रूप से मुझे एजेंटों की स्थिति परवाह नहीं है, मुझे बस इस तथ्य की परवाह है कि यह क्रम में भेजे गए एफएनएस निष्पादित करेगा और मैं उनके लिए समाप्त होने का इंतजार कर सकता हूं।नौकरियों को सिंक्रनाइज़ करने के लिए एजेंटों का उपयोग

काफी बाद यह दर्शाता है कि मैं क्या हासिल करने की कोशिश कर रहा हूँ, नियंत्रक एक बड़ा काम प्रत्येक रोबोट यह का एक हिस्सा हो जाता है हो जाता है,

 

(def *agents* (reduce 
       (fn[h v] (assoc h v (agent true))) 
       {:control (agent true)} (range 0 5))) 

(defn send-job [id f] 
    (send-off (*agents* id) 
      (fn [s f] 
       (try 
       (f) 
       (catch Exception e (println e)))) 
      f)) 

(defn await-job [id] 
    (await (*agents* id))) 

(send-job :control 
      (fn [] 

      (send-job 0 (fn [] 
          (Thread/sleep 10) 
          (println "0 Done."))) 

      (send-job 1 (fn [] 
          (Thread/sleep 2))) 

      (await-job 1) 
      ;; 0 still running. 
      ;; do other stuff... 
      )) 
 

खैर समस्या आप से नहीं भेज बंद कर सकते हैं एक send- के भीतर है मैं "एजेंट कार्रवाई में इंतजार नहीं कर सकता" मिलता है। क्या क्लोजर के समवर्ती उपकरण का उपयोग करके ऐसा करना संभव है या क्या मुझे संरचना जैसे एजेंट को फिर से लागू करना है?

उत्तर

6

आप जो भी चाहें एजेंट कार्रवाई के भीतर से भेज या भेज सकते हैं।

वास्तव में, आप एक एजेंट के भीतर से दूसरे एजेंट को पूरा करने के लिए इंतजार कर सकते हैं। संदेश की तरह ही

यह एक अच्छी बात है, क्योंकि एजेंट में इंतजार करने की इजाजत देने से स्पष्ट रूप से संभावित डेडलॉक्स की ओर जाता है। क्लोजर कॉन्सुरेंसी प्राइमेटिव्स का बिंदु डेडलॉक (और अन्य सहमति-संबंधी समस्याओं) को असंभव बनाना है, यदि आप नियमों से खेलते हैं।

आईएमओ आपका उपयोग केस एजेंटों के लिए आदर्श नहीं है। वे सिंक्रनाइज़ेशन का एसिंक्रोनस पॉइंट होने के लिए हैं, जो अभिनेताओं के inbox queue भाग के समान हैं। चूंकि आपको उस क्षमता की आवश्यकता नहीं है और केवल नौकरी धावकों के रूप में उनका उपयोग करें, मुझे लगता है कि आपको एक सादे जावा ExecutorService के साथ बेहतर सेवा दी जाएगी।

ब्याज भी ForkJoin ढांचा हो सकता है, जो मूल रूप से गणना के छोटे इकाइयों को बंद करने के बारे में है और (संभवतः) परिणाम के लिए आपको उस क्षण की प्रतीक्षा कर रहा है।