Ich versuche, einen Beweis des Konzepts mit akka.net laufen zu lassen. Ich bin sicher, dass ich etwas schrecklich falsch mache, aber ich kann nicht herausfinden, was es ist.Meine Akka.Net Demo ist unglaublich langsam
Ich möchte, dass meine Akteure ein Diagramm von Knoten bilden. Später wird dies eine komplexe grafische Darstellung von Geschäft objekt sein, aber jetzt mag ich eine einfache lineare Struktur wie folgt versuchen:
Ich mag einen Knoten für einen Nachbarn bitten, die 9 Schritte entfernt ist. Ich versuche das rekursiv zu implementieren. Ich frage Knoten # 9 nach einem Nachbarn, der 9 Schritte entfernt ist, dann frage ich Knoten # 8 nach einem Nachbarn, der 8 Schritte entfernt ist und so weiter. Schließlich sollte dies den Knoten # 0 als Antwort zurückgeben.
Nun, mein Code funktioniert, aber es dauert mehr als 4 Sekunden auszuführen. Warum das?
Dies ist meine vollständige Codeauflistung:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Akka;
using Akka.Actor;
namespace AkkaTest
{
class Program
{
public static Stopwatch stopwatch = new Stopwatch();
static void Main(string[] args)
{
var system = ActorSystem.Create("MySystem");
IActorRef[] current = new IActorRef[0];
Console.WriteLine("Initializing actors...");
for (int i = 0; i < 10; i++)
{
var current1 = current;
var props = Props.Create<Obj>(() => new Obj(current1, Guid.NewGuid()));
var actorRef = system.ActorOf(props, i.ToString());
current = new[] { actorRef };
}
Console.WriteLine("actors initialized.");
FindNeighboursRequest r = new FindNeighboursRequest(9);
stopwatch.Start();
var response = current[0].Ask(r);
FindNeighboursResponse result = (FindNeighboursResponse)response.Result;
stopwatch.Stop();
foreach (var d in result.FoundNeighbours)
{
Console.WriteLine(d);
}
Console.WriteLine("Search took " + stopwatch.ElapsedMilliseconds + "ms.");
Console.ReadLine();
}
}
public class FindNeighboursRequest
{
public FindNeighboursRequest(int distance)
{
this.Distance = distance;
}
public int Distance { get; private set; }
}
public class FindNeighboursResponse
{
private IActorRef[] foundNeighbours;
public FindNeighboursResponse(IEnumerable<IActorRef> descendants)
{
this.foundNeighbours = descendants.ToArray();
}
public IActorRef[] FoundNeighbours
{
get { return this.foundNeighbours; }
}
}
public class Obj : ReceiveActor
{
private Guid objGuid;
readonly List<IActorRef> neighbours = new List<IActorRef>();
public Obj(IEnumerable<IActorRef> otherObjs, Guid objGuid)
{
this.neighbours.AddRange(otherObjs);
this.objGuid = objGuid;
Receive<FindNeighboursRequest>(r => handleFindNeighbourRequest(r));
}
public Obj()
{
}
private async void handleFindNeighbourRequest (FindNeighboursRequest r)
{
if (r.Distance == 0)
{
FindNeighboursResponse response = new FindNeighboursResponse(new IActorRef[] { Self });
Sender.Tell(response, Self);
return;
}
List<FindNeighboursResponse> responses = new List<FindNeighboursResponse>();
foreach (var actorRef in neighbours)
{
FindNeighboursRequest req = new FindNeighboursRequest(r.Distance - 1);
var response2 = actorRef.Ask(req);
responses.Add((FindNeighboursResponse)response2.Result);
}
FindNeighboursResponse response3 = new FindNeighboursResponse(responses.SelectMany(rx => rx.FoundNeighbours));
Sender.Tell(response3, Self);
}
}
}
Können Sie die Stoppuhr nach dem Erstellen des ActorSystem starten und es erneut versuchen? –
Das ist genau das, was der Code tut - oder zumindest, was ich beabsichtigt habe. Ich starte die Stoppuhr _nach der 'for (int i = 0; i <10; i ++) Schleife. – user1691896
Oh ja, ich habe es falsch gelesen. Wie Horusiath sagte, Schauspieler sollten nicht blockieren, Sie erleben einen Threadpool-Hunger. –