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


73

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.


4
"O futuro promete consumidores produtores". (Mas, para programação, troque os dois últimos porque Futuros (zero ou mais) é análogo ao consumo de um valor, e Promise (com apenas o primeiro capaz de ter sucesso) é análogo a produzir um valor.)
rwong

A palestra incrível sobre futuros / promessas sobre Coursera "princípios da programação Reactive", de Martin Odersky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , Semana 3
GKislin

@rwong: "O futuro promete aos consumidores produtores" - hein? Isso significa uma sentença significativa que funciona como um mnemônico para nos lembrar da diferença entre futuros e promessas? Meu cérebro falhou totalmente em analisá-lo. E você também está dizendo que está errado e precisa trocar palavras, mas, por algum motivo, você não fez isso antes de digitar. E, finalmente, está entre aspas, mas o Google não traz outros hits além do seu comentário. Mega-perplexo.
Bacar

Respostas:


54

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 Futures e Promises, mas você só pode escrever para Promises. Você pode obter o Futureassociado a Promisechamando o futuremétodo, mas a conversão na outra direção não é possível (porque seria absurdo).



19

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 Promiseoferece 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.


Este é o caso de JS Promises e Python Futures também.
quer

6

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.