Qual é a diferença entre um futuro e uma promessa? (Em Akka e Gpars.)
Eles me parecem iguais, ao mesmo tempo em que bloqueiam e retornam o valor do futuro quando get é chamado e uma promessa é obter o resultado de um futuro.
Qual é a diferença entre um futuro e uma promessa? (Em Akka e Gpars.)
Eles me parecem iguais, ao mesmo tempo em que bloqueiam e retornam o valor do futuro quando get é chamado e uma promessa é obter o resultado de um futuro.
Respostas:
Vou falar sobre o Akka / Scala, porque não estou familiarizado com o Gpars nem com o Akka / Java.
No Scala 2.10, que inclui a parte relevante da Akka na distribuição padrão, a Future
é essencialmente uma referência somente leitura a um valor ainda a ser calculado. A Promise
é praticamente o mesmo, exceto que você pode escrever para ele também . Em outras palavras, você pode ler a partir de ambos Future
s e Promise
s, mas você só pode escrever para Promise
s. Você pode obter o Future
associado a Promise
chamando o future
método, mas a conversão na outra direção não é possível (porque seria absurdo).
Segundo a wikipedia , eles são o mesmo conceito:
Na ciência da computação, futuro, promessa e atraso se referem às construções usadas para sincronizar em algumas linguagens de programação simultâneas. Eles descrevem um objeto que atua como um proxy para um resultado que é inicialmente desconhecido, geralmente porque o cálculo de seu valor ainda está incompleto.
Algumas bibliotecas podem optar por chamá-las de uma maneira, outras podem optar por chamá-las de outra. E cada vez, eles podem ser implementados em diferentes sabores. Algumas bibliotecas podem optar por usar esses sinônimos para distinguir diferentes sabores. Embora eu argumentasse que essa é uma má escolha (porque evidentemente confunde as pessoas), esse link sugere que em Scala essa prática comum.
Como a chama de @ Ptharien sugeriu, em Scala a Future
é uma operação somente leitura, enquanto a Promise
oferece a capacidade de gerar um resultado (ou falha) para a operação que representa.
Assim, A Promise
é melhor usado pelo código responsável pela execução da operação para propagar o resultado, enquanto a Future
é usado para expô-lo ao código do cliente, que, por sua vez, aguardará o resultado. Mas, novamente, observe que essa distinção é específica do Scala e pode confundir pessoas de fora.
Vou acrescentar um pouco aqui porque tenho trabalhado com uma infinidade de futuros em Java ultimamente, mas também tenho experiência em desenvolvimento Scala / Akka. Essa resposta duplicará principalmente o que foi dito, mas apontará a infinidade de implementações em uso popular hoje na JVM.
Primeiro, o pôster original menciona o uso de get e bloqueio - nunca faça isso fora dos testes.
Quando ensino conceitos de FP e simultaneidade em minha função atual, primeiro digo ao aluno que promessas e futuros semanticamente são sinônimos porque, como consumidor de uma promessa ou de uma API futura, o desenvolvedor não precisa entender que existem ou se existem. diferenças semânticas - apenas a mecânica para lidar com elas sem bloquear IO.
Dizer que um futuro não pode ser concluído e que uma promessa pode (por exemplo, conforme scala / akka / play apis, por exemplo) é muito simplista:
Alguns futuros podem ser concluídos O Java8 agora introduz um CompletableFuture na biblioteca padrão.
Algumas promessas não podem ser concluídas Da mesma forma, na API de promessa do Play, uma promessa não pode ser cumprida, mas um RedeemablePromise pode, portanto, o play introduz uma semântica diferente - mesmo estando sob o guarda-chuva Typesafe. Além disso, a API do Play promessa pode ser convertida com futuros scala nas duas direções - (F.Promise.wrap (future) ou promessa.wrapped ()).
Ao trabalhar com a tecnologia Typesafe no Java8, você sempre alterna entre futuros / promessas simplesmente porque uma API é preferível (a API do Play Promise parece melhor com as lambdas do Java8). No Akka + Play + Java8, você pegará os futuros dos atores e os envolverá em promessas, compondo retornos de chamada e devolvendo-os do controlador.
Então, como digo às pessoas quando ensino, promessas e futuros são mais ou menos sinônimos.