दुश्मन के लिए एक MailboxProcessor सिमुलेशन इस प्रकार दिखाई देंगे:
MailboxProcessor.Start(fun inbox ->
async {
while true do
let! message = inbox.Receive()
processMessage(message)
})
यह संदेश आने के लिए (let! message =
लाइन), जबकि यह इंतजार कर रहा है एक धागा उपभोग नहीं करता है। हालांकि, एक बार संदेश आने पर यह एक थ्रेड (थ्रेड पूल पर) का उपभोग करेगा। यदि आपके पास 100 मेलबॉक्स प्रोसेसर हैं जो सभी को एक साथ संदेश प्राप्त होता है, तो वे सभी जागने और थ्रेड का उपभोग करने का प्रयास करेंगे। चूंकि यहां संदेश प्रसंस्करण सीपीयू बाध्य है, 100 मेलबॉक्स प्रोसेसर के सभी जागते हैं और स्पॉन्गिंग (थ्रेड पूल) धागे शुरू करते हैं। यह एक अच्छा प्रदर्शन नहीं है।
एक स्थिति मेलबॉक्स प्रोसेसर एक्सेल में ऐसी स्थिति है जहां बहुत सारे समवर्ती ग्राहक एक प्रोसेसर को संदेश भेजते हैं (कल्पना करें कि कई समांतर वेब क्रॉलर सभी डाउनलोड पेज और कतार में परिणाम डुबो रहे हैं)। ऑन-स्क्रीन दुश्मन का मामला अलग दिखाई देता है - यह संदेश के एक स्रोत (प्लेयर आंदोलन/समय टिक) का जवाब देने वाली कई संस्थाएं हैं।
एक अन्य उदाहरण है जहां MailboxProcessors के हजारों के लिए एक महान समाधान है मैं/हे बाध्य MailboxProcessor है:
MailboxProcessor.Start(fun inbox ->
async {
while true do
let! message = inbox.Receive()
match message with
| ->
do! AsyncWrite("something")
let! response = AsyncResponse()
...
})
यहाँ संदेश एजेंट बहुत जल्दी एक धागा पैदावार लेकिन अभी भी अतुल्यकालिक संचालन भर में राज्य को बनाए रखने की जरूरत है प्राप्त करने के बाद। यह अभ्यास में बहुत अच्छी तरह से स्केल करेगा - आप हजारों और हजारों एजेंटों को चला सकते हैं: यह एक वेब सर्वर लिखने का एक शानदार तरीका है।
स्रोत
2010-08-09 21:02:25
जैसा कि मैंने नीचे दिए गए मेरे उत्तर में बताया है, कई सारे ऑन-स्क्रीन दुश्मनों के मामले में, यदि आप एक संदेश प्राप्त करते हैं, तो एक संदेश प्राप्त होने के बाद, संभवतः एक गैर-मामूली मात्रा में काम करेगा, ergo आप कोशिश करेंगे एक समान मात्रा में काम निष्पादित करने के लिए जो समानांतर होने का प्रयास करता है। ऐसा करने का कोई कारण नहीं है - आपके प्रोसेसर वास्तव में समानांतर में चलने वाले बहुत सारे धागे हैं। तो आपके पास कोर के रूप में कई प्रोसेसर हैं और उनके बीच दुश्मनों को विभाजित करते हैं। –
थ्रेडपूल ज्यादातर आपकी ओर से ऐसा करेगा, हां? जितना चाहें उतना 'समांतर' काम बनाएं, और थ्रेडपूल को काम को व्यवस्थित रूप से शेड्यूल करने के लिए अपना काम करने दें। – Brian
आपको प्रति संदेश एक थ्रेड पूल ओवरहेड मिलता है जो पूरी तरह से महान नहीं है। मैंने ट्रेड-ऑफ को समझाने के लिए नीचे अपना जवाब विस्तारित किया है। –