2009-10-29 7 views
24

Clojure एपीआई के रूप में इन दो कार्यों का वर्णन करता है:एजेंट को किसी कार्रवाई को प्रेषित करने के संबंध में क्लोजर के "प्रेषण" और "प्रेषण" कार्यों के बीच क्या अंतर है?

(एक च & आर्ग भेज) - एक एजेंट की जाने वाली कार्रवाई डिस्पैच। तुरंत एजेंट देता है। बाद में, एक थ्रेड पूल से एक धागे में, एजेंट के राज्य के मान पर सेट किया जाएगा: (कार्रवाई fn राज्य के एजेंट आर्ग लागू)

और

(भेजना -ऑफ & तर्क) - किसी एजेंट को संभावित रूप से अवरुद्ध करने वाली कार्रवाई को प्रेषित करें। तुरंत एजेंट देता है। बाद में, एक अलग थ्रेड में, एजेंट के राज्य के मान पर सेट किया जाएगा: (कार्रवाई fn राज्य के एजेंट आर्ग लागू)

केवल स्पष्ट अंतर भेजने बंद होना चाहिए जब कोई क्रिया अवरुद्ध हो सकती है तब उपयोग किया जाता है। क्या कोई इस कार्यक्षमता को अधिक विस्तार से कार्यक्षमता में समझा सकता है?

उत्तर

23

send का उपयोग कर किसी भी एजेंट को भेजे गए सभी कार्यों को थ्रेड पूल में चलाया जाता है जिसमें प्रोसेसर की भौतिक संख्या की तुलना में कुछ और धागे होते हैं। इससे उन्हें सीपीयू की पूर्ण क्षमता के करीब चलने का कारण बनता है। यदि आप send का उपयोग करके 1000 कॉल करते हैं तो आपको वास्तव में अधिक स्विचिंग ओवरहेड नहीं होता है, जिन कॉलों को संसाधित नहीं किया जा सकता है, बस प्रोसेसर उपलब्ध होने तक प्रतीक्षा करें। यदि वे ब्लॉक करते हैं तो थ्रेड पूल शुष्क हो सकता है।

जब आप send-off का उपयोग करते हैं, तो प्रत्येक कॉल के लिए एक नया धागा बनाया जाता है। यदि आप send-off 1000 फ़ंक्शंस, जिन्हें तुरंत संसाधित नहीं किया जा सकता है, वे अभी भी अगले उपलब्ध प्रोसेसर की प्रतीक्षा कर सकते हैं, लेकिन प्रेषण थ्रेडपूल कम चलने पर होता है तो वे थ्रेड शुरू करने के अतिरिक्त ओवरहेड ले सकते हैं। यह ठीक है अगर धागे ब्लॉक करते हैं क्योंकि प्रत्येक कार्य (संभावित रूप से) एक समर्पित धागा प्राप्त करता है।

+14

प्रेषण वास्तव में एक नया धागा नहीं बनाता है, यह एक अलग, विस्तारणीय थ्रेड पूल का उपयोग करता है। – pmf

+1

धन्यवाद: मैं इसे शामिल करने के लिए संपादित कर दूंगा। यह बात बताने के लिए धन्यवाद। –

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