Qual é a diferença entre um futuro e uma promessa?

72

Qual é a diferença entre um futuro e uma promessa? (Em Akka e Gpars.)

Eles têm a mesma aparência para mim, tanto bloqueiam quanto retornam o valor do futuro quando get é chamado e uma promessa é obter o resultado de um futuro.

    
por Suminda Sirinath S. Dharmasena 04.08.2013 / 14:21
fonte

3 respostas

53

Eu vou falar sobre Akka / Scala, porque eu não estou familiarizado com Gpars nem com Akka / Java.

No Scala 2.10, que inclui a parte relevante do Akka na distribuição padrão, um Future é essencialmente uma referência somente leitura para um valor ainda a ser calculado. Um Promise é praticamente o mesmo exceto que você também pode escrever nele . Em outras palavras, você pode ler de Future se Promise s, mas você só pode gravar em Promise s. Você pode obter o Future associado a um Promise chamando o método future , mas a conversão na outra direção não é possível (porque seria absurdo).

    
por 04.08.2013 / 20:43
fonte
19

De acordo com a Wikipedia , eles são o mesmo conceito:

In computer science, future, promise, and delay refer to constructs used for synchronizing in some concurrent programming languages. They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is yet incomplete.

Algumas bibliotecas podem optar por chamá-las de uma maneira, algumas 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. Enquanto eu diria que esta é uma má escolha (porque evidentemente confunde as pessoas), este link sugere que em Scala esta prática comum.

Como o @Ptharien's Flame sugeriu, no Scala um Future é uma operação somente de leitura, enquanto um Promise dá a você a capacidade de produzir um resultado (ou falha) para a operação que representa.

Um Promise é assim melhor usado pelo código responsável por realizar a operação para propagar o resultado, enquanto um 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.

    
por 04.08.2013 / 21:52
fonte
6

Eu adicionarei um pouco aqui porque eu tenho trabalhado com uma infinidade de Futures em Java ultimamente, mas tenho um background no desenvolvimento do Scala / Akka também. Esta resposta irá duplicar o que já foi dito, mas irá apontar a pletora de implementações em uso popular hoje na JVM.

Primeiro, o cartaz original menciona o uso de bloqueio e bloqueio - por favor, nunca faça isso fora dos testes.

Quando eu ensino conceitos de FP e Simultaneidade no meu papel atual, primeiro digo ao aluno que semanticamente promessas e futuros são sinônimos, porque como consumidor de uma promessa ou de uma futura API, o desenvolvedor não precisa entender que existem ou SE houver 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, como scala / akka / play apis, por exemplo) é muito simplista:

Alguns futuros podem ser concluídos 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 Google Play, uma Promessa não pode ser cumprida, mas uma RedeemablePromise pode ser reproduzida, introduzindo uma semântica diferente - mesmo estando sob o guarda-chuva Typesafe. Além disso, a API de promessa de reprodução pode converter com futuros scala em ambas as direções - (F.Promise.wrap (future) ou promise.wrapped ()).

Trabalhando com a tecnologia Typesafe no Java8, muitas vezes você vai e volta entre futuros / promessas simplesmente porque uma API é preferível (a API do Play Promise parece melhor com o Java8 lambdas). Em Akka + Play + Java8, você estará pegando futuros de Atores e envolvendo-os em promessas, compondo callbacks e retornando isso do controlador.

Então, como eu digo às pessoas quando ensino, Promessas e Futuros são mais ou menos sinônimos.

    
por 06.12.2014 / 16:55
fonte