2016-02-22 8 views
5

में तुरंत एकाधिक धागे को फायर करें, मुझे यकीन नहीं है कि यह akka.net या TPL से अधिक संबंधित है, लेकिन मैं प्रश्न को स्पष्ट करने के लिए अपने उदाहरण के लिए अभिनेताओं का उपयोग करूंगा।akka.net

संक्षेप में प्रश्न: क्या वास्तव में CPU कोर के मुकाबले एक बार में अधिक धागे को आग लगाने के लिए akka.net को बताने का कोई तरीका है? यहां नमूना कोड और विवरण दिया गया है:

मैं वर्तमान में एक 8-कोर प्रोसेसर वाला लैपटॉप उपयोग कर रहा हूं।

for (int i = 0; i < 20; i++) 
{ 
    actorList.Add(system.ActorOf<ExampleActor>()); 
} 

और फिर मैं उन सभी के लिए एक संदेश गुजर रही है::

actorList[0].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 1\t" + DateTime.Now.TimeOfDay); 
actorList[1].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 2\t" + DateTime.Now.TimeOfDay); 
... 
actorList[19].Tell(new ExampleMessage()); 
Console.WriteLine("sent message to actor 20\t" + DateTime.Now.TimeOfDay); 

सभी अभिनेता करता है, जबकि संदेश प्राप्त करने निम्नलिखित नकली है तो चलो कहते हैं कि मैं 20 अभिनेताओं बना रहा हूं जाने लंबी चलने वाली प्रक्रिया:

Console.WriteLine("Accessing slow service\t" + DateTime.Now.TimeOfDay 
    + "\t" + Thread.CurrentThread.ManagedThreadId); 
Thread.Sleep(60000); 
Console.WriteLine("Service call was successful\t" + DateTime.Now.TimeOfDay 
    + "\t" + Thread.CurrentThread.ManagedThreadId); 

ताकि मैं जानता हूँ कि जब अभिनेता बनाने से मैं भी अपने निर्माता में इस कोड है,:

public ExampleActor() 
{ 
    Console.WriteLine("Creating " + this.Self.Path + DateTime.Now.TimeOfDay); 
    .... 
} 

तो अब जब मैं एप्लिकेशन चलाता हूं तो मुझे पहले सभी 20 कलाकारों के लिए "अभिनेता को भेजा गया संदेश" मिलता है - उसी मिलीसेकंड में। लेकिन बाद में, जब समय प्रारंभिकरण से आता है, तो क्या होता है कि पहले 8 अभिनेता पहले बनाए जाते हैं।

फिर, चूंकि अन्य कलाकारों ने नौकरी समाप्त नहीं की है, ठीक उसी समय 1 सेकंड बाद, दूसरा एक प्रारंभ किया गया है (9वीं)। एक और बाद में, हमारे 10 वें अभिनेता ने बनाया और थ्रेड शुरू किया। स्लीप ऑपरेशन।

अब सवाल यह है कि क्या akka.net (या इसके नीचे टीपीएल) को बताने का कोई तरीका है कि मुझे यकीन है कि धागे प्रत्येक सेवा कॉल के लिए ~ 60 सेकंड का इंतजार करेंगे? ताकि सभी 20 धागे एक बार में फेंक दिए जाएंगे, 8 बार एक बार शुरू होने की बजाय, और 12 सेकंड के बाद चलने वाले पूर्ण 20 धागे बीत चुके हैं?

उत्तर

3

अक्का अभिनेता डिफ़ॉल्ट रूप से .Net ThreadPool पर चलते हैं।

आप थ्रेडपूल भुखमरी का अनुभव कर रहे हैं जहां सभी उपलब्ध थ्रेड व्यस्त हैं (प्रति सीपीयू एक)। जब उसके सभी धागे व्यस्त होते हैं, तो थ्रेडपूल अपने पूल में प्रति सेकंड एक और धागा जोड़ता है।

अपनी समस्या को हल करने के लिए आप थ्रेडपूल.SetMinThreads के साथ न्यूनतम थ्रेड गिनती बढ़ा सकते हैं। लेकिन वास्तविक फिक्स धागे को अवरुद्ध नहीं करना है (और अभिनेताओं को अवरुद्ध नहीं करना)।

यदि आपका वर्कलोड सीपीयू बाध्य है, तो अधिक अभिनेता एक साथ चलने के लिए तेज़ी से नहीं जाएंगे।

अपने काम का बोझ आईओ ही है, तो आप इसे एसिंक्रोनस रूप से फोन करना चाहिए:

Receive<string>(msg => 
{ 
    DoSomethingAsync(msg).PipeTo(Self); 
} 

Receive<Result>(msg => 
{ 
    // Process the result 
} 
+0

धन्यवाद। दुर्भाग्यवश कुछ ग्राहक स्पष्ट थ्रेड गिनती सेटिंग्स चाहते हैं, लेकिन इसे पढ़ने वाले किसी भी व्यक्ति के लिए, जो आवश्यकताओं से बंधे नहीं हैं, मेरा सुझाव है कि आप एसिंक रूट का पालन करें। दोनों का परीक्षण किया गया, सब कुछ पूरी तरह से काम करता है। – nikovn