Folosind un raspuns de la un actor la curent actor procesul

0

Problema

Sunt confuz despre cum ar trebui să rezolve acest scenariu într-un non-blocking mod.

Luați în considerare doi actori Actor1 și Actor2

În Actor1

Map<Int, Int> foo() {
     List<String> finalList = foo_2();
     Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

List<String> foo_2() {
    
     CompletableFuture<List<String>> Querylist = ask(Actor2)
     Querylist.get();
     
     return QueryList;
}

În prezent, în cadrul foo_2, Querylist.get() este un apel de blocare. Vreau pentru a rezolva cumva acest lucru într-un non-blocking mod. Am creat un mesaj adaptor pentru Actor2 în interiorul Actor1 deci, orice mesaje care Actor2 trimite vor fi gestionate de Actor1.

Am folosit următoarea abordare pentru a modifica apel de blocare

Map<Int, Int> foo() {
     CompletionStage<List<String>> finalList = foo_2();
     finalList.whenComplete(
        // what to do here? 
     )
     // Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

CompletionStage<List<String>> foo_2() {
    
     CompletionStage<List<String>> Querylist = ask(Actor2)
     
     
     return QueryList;
}

Eu nu sunt sigur cum să utilizați în mod corect CompletionStage construct pentru a obține același rezultat am fost cu un blocaj futures.obține() apel.

2

Cel mai bun răspuns

1

Dacă utilizați Akka Tastat (implicite de tag-ul), nu ai nevoie de un viitor sau un mesaj adaptor la toate. Doar folosi ActorContext.ask.

Consultați documentația pentru cerere-răspuns cu ceară între doi actori.

În linii mari, că vei scăpa de foo și foo_2 metode, muta mesajul adaptor ați configurat în ActorContext.ask apel, și înlocuiți cazuri în care te-am numit anterior foo cu un apel la ActorContext.ask. Dacă răspunsul tău actor trimite mesaj care a dus la cer depinde de răspunsul la cer, apoi o bună practică este de a încorpora necesare porțiuni de stat în mesajul adaptorul generează.

2021-10-25 00:19:07

Vă mulțumim pentru răspunsul dumneavoastră, acest lucru este ceea ce am ajuns să fac. Știi care este diferența între a face o .spune() vs folosind ActorContext.cere()? Este diferența care vă trece "handler" în mod explicit în ActorContext.cere() ?
PyWalker2797

Cere în cele din urmă face toate lucrările de gestionarea cerere-răspuns interacțiune pentru tine: este construit pe partea de sus a spune (mai mult sau mai puțin totul în Akka este, după toate). În linii mari, cere icre actor și injectează o trimitere la acel actor ca răspuns la adresa din mesaj pentru a trimite. Atunci când actorul primește un mesaj, se execută adaptor și transmite adaptat răspuns la actorul care a trimis din cer; ca actor, de asemenea, programe un mesaj de la sine după timeout expiră care se transformă în mesaj timeout.
Levi Ramsey

Pentru a icrelor un actor pentru primirea acestui răspuns, este mai puțin eficientă decât înregistrarea unui mesaj de adaptor, face o spune, și programarea unui timeout mesaj pentru tine. Cu toate acestea, puteți avea în mod arbitrar mulți întreabă cu diferite adaptoare în zbor: cu spune + adaptor, s-ar putea lovi de limita de un adaptor pentru fiecare tip (înregistrarea unui adaptor diferit pentru același tip poate fi imprevizibil și de moștenire, de asemenea, poate juca ravagii cu această abordare). Spune + adaptor de abordare are avantajul de a permite mai multe răspunsuri.
Levi Ramsey

Asta clarifica multe. Știi cu aproximație, cât de importante sunt cheltuielile de regie?
PyWalker2797

Puteți, de asemenea, ajuta-ma cu o altă întrebare.- stackoverflow.com/questions/69725512/...
PyWalker2797

Pe deasupra este neglijabil: câteva sute de bytes de memorie de consum și, probabil, o microsecundă sau atât de latență suplimentar în obținerea răspunsului la asker.
Levi Ramsey
1

Puteți utiliza pipeToSelfvezi https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-self, pentru a trimite rezultatul cere pentru actorul însuși. În loc de încercarea de a obține valoare pentru finalList direct în foo(), care este posibilă numai cu o blocare getrezultatul foo() pot fi trimise la actorul în sine, în cazul în care te descurci ca orice alt mesaj. Este o bună practică pentru a crea un anumit tip de mesaj pentru acest lucru.

Ar trebui, de asemenea, au o privire la CompletionStage metode, cel mai important thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-) ceea ce face posibil de a transforma rezultatele, de exemplu pentru a crea un Map din finalListși, de exemplu, un MapMessage din Map. Apoi, va trebui să se ocupe de MapMessage ca orice alt mesaj în actor.

2021-10-25 00:12:28

Hi Mulțumiri pentru răspunsul dumneavoastră. În cele din urmă m-am dus cu răspunsul acceptat, deoarece se pare mai idiomatice.
PyWalker2797

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................