Utilizando uma resposta de um ator no atual processo ator

0

Pergunta

Estou confuso sobre como eu deveria resolver essa situação sem bloqueio maneira.

Considere dois atores Actor1 e Actor2

Dentro 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;
}

Atualmente dentro foo_2, Querylist.get() é uma chamada de bloqueio. Quero de alguma forma de resolver isso sem bloqueio maneira. Eu criei uma mensagem adaptador para Actor2 dentro Actor1 assim, todas as mensagens que Actor2 envia serão tratadas pelo Actor1.

Eu usei a seguinte abordagem para modificar a chamada de bloqueio

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 não tenho certeza de como usar corretamente o CompletionStage construir para obter o mesmo resultado que eu estava ficando com um bloqueio de futuros.get() chamada.

2

Melhor resposta

1

Se você estiver usando o Akka Digitado (implícita de marca), você não deveria precisar de um futuro ou uma mensagem de adaptador em tudo. Basta usar ActorContext.ask.

Consulte a documentação para solicitação-resposta com a peça entre os dois intervenientes.

Amplamente, você gostaria de se livrar da foo e foo_2 métodos, mover a mensagem adaptador que você configurou para o ActorContext.ask chamada, e substituir as instâncias em que você tenha sido chamado foo com uma chamada para ActorContext.ask. Se a resposta a sua ator envia a mensagem que levou à peça depende da resposta para a peça e, em seguida, uma boa prática é incorporar as partes necessárias do estado na mensagem a placa gera.

2021-10-25 00:19:07

Obrigado pela sua resposta, isso é o que eu acabei fazendo. Você sabe qual é a diferença entre fazer um .conte() vs utilizando ActorContext.ask()? É a diferença que você está passando o "manipulador" explicitamente no ActorContext.ask() ?
PyWalker2797

A peça, em última análise, faz todo o trabalho de gerenciamento de pedido-resposta interação para você: ele é construído em cima diz (mais ou menos tudo em Akka é, depois de tudo). De forma ampla, a peça gera um ator e injeta uma referência para que o ator como o endereço de resposta da mensagem para enviar. Quando o ator recebe uma mensagem, ele executa o adaptador e encaminha a resposta adaptada para o ator, que enviou a fazer; que o ator também agenda uma mensagem para si próprio para depois de expira o tempo limite que transforma a mensagem de limite de tempo.
Levi Ramsey

Porque ele gera um ator para receber a resposta, é um pouco menos eficiente do que registar uma mensagem de placa, fazendo um dizer, e o agendamento de uma mensagem de limite de tempo para si mesmo. No entanto, você pode ter qualquer número de pergunta com diferentes placas de vôo: com dizer + adaptador, você pode atingir o limite de um adaptador, por tipo (registrando um adaptador diferente para o mesmo tipo podem ser imprevisíveis e a herança também pode jogar o havoc com esta abordagem). O dizer + adaptador abordagem tem a vantagem de permitir múltiplas respostas.
Levi Ramsey

Que esclarece muito. Você sabe aproximadamente, quão significativa é a sobrecarga é?
PyWalker2797

Você também pode me ajudar com outra pergunta.- stackoverflow.com/questions/69725512/...
PyWalker2797

A sobrecarga é insignificante: algumas centenas de bytes de consumo de memória e, provavelmente, um microssegundo, ou então latência extra em obter a resposta para o asker.
Levi Ramsey
1

Você pode usar pipeToSelf, ver https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-selfpara enviar o resultado da peça para o ator em si. Em vez de tentar obter o valor para finalList diretamente no foo(), o que só é possível com um bloqueio de geto resultado do foo() podem ser enviadas para o ator em si, caso em que você lidar com isso, como qualquer outra mensagem. É boa prática criar um tipo de mensagem específica para isso.

Você também deve ter um olhar para CompletionStage métodos, o mais importante thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-), o que torna possível a transformação de resultados, por exemplo, para criar um Map do finalListe por exemplo, de uma MapMessage do Map. Em seguida, você deverá lidar com a MapMessage como qualquer outra mensagem, o ator.

2021-10-25 00:12:28

Olá, Obrigado por sua resposta. Finalmente, eu fui com o aceite de resposta, pois parece mais idiomáticas.
PyWalker2797

Em outros idiomas

Esta página está em outros idiomas

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