2010-08-09 14 views
16

मैंने अभी F # में मेलबॉक्स प्रोसेसर की खोज की है और इसका उपयोग "राज्य मशीन" के रूप में किया जाता है ... लेकिन मुझे उनके द्वारा अनुशंसित उपयोग पर अधिक जानकारी नहीं मिल रही है।मेलबॉक्सप्रोसेसर उपयोग दिशानिर्देश?

उदाहरण के लिए ... कहें कि मैं 100 ऑन-स्क्रीन दुश्मनों के साथ एक साधारण गेम बना रहा हूं, क्या मुझे दुश्मन की स्थिति और स्वास्थ्य को बदलने के लिए मेलबॉक्सप्रोसेसर का उपयोग करना चाहिए; मुझे 200 सक्रिय मेलबॉक्स प्रोसेसर दे रहा है?

क्या हुड के नीचे कोई चालाक धागा प्रबंधन चल रहा है? क्या मुझे सक्रिय मेलबॉक्स प्रोसेसर की मात्रा को आजमाकर सीमित करना चाहिए या क्या मैं उन्हें बाहर निकाल रहा हूं?

अग्रिम धन्यवाद,

जेडी।

उत्तर

6

प्रति

http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx

के रूप में आप उन्हें बाहर बिना सोचे समझे टकरा कर सकते हैं। कोशिश करो! वे थ्रेडपूल का उपयोग करते हैं। मैंने रीयल-टाइम जीयूआई गेम ऐप के लिए यह कोशिश नहीं की है, लेकिन अगर यह 'पर्याप्त पर्याप्त' है तो मुझे आश्चर्य नहीं होगा।

+0

जैसा कि मैंने नीचे दिए गए मेरे उत्तर में बताया है, कई सारे ऑन-स्क्रीन दुश्मनों के मामले में, यदि आप एक संदेश प्राप्त करते हैं, तो एक संदेश प्राप्त होने के बाद, संभवतः एक गैर-मामूली मात्रा में काम करेगा, ergo आप कोशिश करेंगे एक समान मात्रा में काम निष्पादित करने के लिए जो समानांतर होने का प्रयास करता है। ऐसा करने का कोई कारण नहीं है - आपके प्रोसेसर वास्तव में समानांतर में चलने वाले बहुत सारे धागे हैं। तो आपके पास कोर के रूप में कई प्रोसेसर हैं और उनके बीच दुश्मनों को विभाजित करते हैं। –

+0

थ्रेडपूल ज्यादातर आपकी ओर से ऐसा करेगा, हां? जितना चाहें उतना 'समांतर' काम बनाएं, और थ्रेडपूल को काम को व्यवस्थित रूप से शेड्यूल करने के लिए अपना काम करने दें। – Brian

+0

आपको प्रति संदेश एक थ्रेड पूल ओवरहेड मिलता है जो पूरी तरह से महान नहीं है। मैंने ट्रेड-ऑफ को समझाने के लिए नीचे अपना जवाब विस्तारित किया है। –

12

दुश्मन के लिए एक 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() 
     ... 
}) 

यहाँ संदेश एजेंट बहुत जल्दी एक धागा पैदावार लेकिन अभी भी अतुल्यकालिक संचालन भर में राज्य को बनाए रखने की जरूरत है प्राप्त करने के बाद। यह अभ्यास में बहुत अच्छी तरह से स्केल करेगा - आप हजारों और हजारों एजेंटों को चला सकते हैं: यह एक वेब सर्वर लिखने का एक शानदार तरीका है।

+0

"यदि आपके पास 100 मेलबॉक्स प्रोसेसर हैं जो सभी को एक साथ संदेश प्राप्त होता है, तो वे सभी जागते हैं और धागे का उपभोग करने का प्रयास करेंगे।" - मुझे सही नहीं लगता है। मैंने मेलबॉक्सप्रोसेसरों के गैर-तुच्छ उपयोग के कुछ अनुप्रयोगों को लिखा है, और किसी भी समय सक्रिय धागे की संख्या थ्रेड-पूल द्वारा निर्धारित की जाती है, जो बदले में आपकी मशीन पर प्रोसेसर की संख्या द्वारा निर्धारित (मुझे लगता है) । एक साथ 100 मेलबॉक्स भी मारते हुए, मैंने कभी भी किसी भी समय सक्रिय कुछ थ्रेड सक्रिय नहीं देखा। – Juliet

+1

जूलियट, ठीक है, मुझे "जागने का प्रयास" कहा जाना चाहिए था। थ्रेड पूल निष्पादन के लिए कतार में सस्ता नहीं है। –

4

का कहना है कि मैं 100 ऑन-स्क्रीन दुश्मनों के साथ एक साधारण गेम बना रहा हूं, क्या मुझे दुश्मन की स्थिति और स्वास्थ्य को बदलने के लिए मेलबॉक्सप्रोसेसर का उपयोग करना चाहिए; मुझे 200 सक्रिय मेलबॉक्स प्रोसेसर दे रहा है?

मुझे इसके लिए MailboxProcessor का उपयोग करने का प्रयास करने का कोई कारण नहीं दिख रहा है। एक धारावाहिक पाश बहुत आसान और तेज होने की संभावना है।

क्या हुड के नीचे कोई चालाक धागा प्रबंधन चल रहा है?

हाँ, बहुत कुछ। लेकिन क्या यह एसिंक्रोनस समवर्ती प्रोग्रामिंग (विशेष रूप से स्केलेबल आईओ) के लिए डिज़ाइन किया गया है और आपका प्रोग्राम वास्तव में ऐसा नहीं कर रहा है।

क्या मुझे सक्रिय मेलबॉक्सप्रोसेसर की मात्रा को आजमाकर सीमित करना चाहिए या क्या मैं उन्हें बाहर निकलना जारी रख सकता हूं?

आप उन्हें बाहर निकाल सकते हैं लेकिन वे अनुकूलित से बहुत दूर हैं और प्रदर्शन धारावाहिक कोड से भी बदतर है।

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