2016-02-22 16 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 1)を初期化します。もう1秒後に、私たちの10番目の俳優が作成され、Thread.Sleep操作が開始されます。

今の質問は、私はスレッドが各サービスコールのために〜60秒間待つことを確信していakka.netを伝えるためにどのような方法(またはそれ以下TPL)はありますか?一度に8つのスレッドを起動するのではなく、20スレッドすべてを一度に起動するようにします。

答えて

3

デフォルトでは、Akkaアクターは.Net ThreadPoolで実行されます。

あなたはすべての利用可能なスレッドが(CPUあたり1)忙しいのThreadPool飢餓を経験しています。すべてのスレッドがビジー状態になると、ThreadPoolはプールに1秒間に1つのスレッドを追加します。あなたはThreadPool.SetMinThreadsと最小スレッド数を増やすことができ、あなたの問題を「解決」するために

。しかし、実際の修正は、スレッドをブロックしない(そしてアクターをブロックしない)ことです。

ワークロードがCPUバウンドの場合、より多くのアクターを同時に実行させることはできません。

ワークロードがバインドIOである場合は、非同期的に呼び出す必要があります:

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

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

ありがとうございました。残念ながら、一部のクライアントは明示的なスレッド数の設定を必要としますが、これを読んだ人は、要件に縛られていない人には、非同期ルートに従うことをお勧めします。 両方をテストしたところ、すべてが完全に機能します。 – nikovn

関連する問題