erlang promise akka actor

¿Erlang admite una operación de "preguntar"?



promise akka (3)

No, no es así, pero lo que solicita es fácil de implementar:

ask(Pid, M) -> Promise = erlang:monitor(process, Pid), Pid ! {ask, Promise, M}, Promise.

En espera del resultado de la promesa ahora se puede hacer por:

force(Promise, Timeout) -> receive {result, Promise, R} -> erlang:demonitor(Promise, [flush]), {ok, R}; {''DOWN'', Promise, process, _, Reason} -> {error, {callee_died, Reason}} after Timeout -> {error, timeout} end.

Si no quiere hacer nada entre preguntar y la fuerza, entonces puede usar el gen_server comportamiento OTP que tiene un gen_server:call/3 esencialmente implementando estas dos funciones de una vez.

Observe cómo en lo anterior solicitamos una referencia de monitor en el Pid destino que nos permite monitorearlo si se muere. También usamos esta referencia como una etiqueta única para la promesa, por lo que podemos encontrarla entre otros mensajes que se parecen a ella en el buzón.

En Akka tienes dos mecanismos de envío diferentes:! por decirle cosas al actor, y ? por preguntarle a un actor sobre cosas, ¡la principal diferencia para los que no están familiarizados es ese actor ! message actor ! message es una operación de fuego y olvido , y actor ? message actor ? message devuelve una promesa de un resultado que luego en un momento posterior debe ser resuelto.

No he podido encontrar nada con respecto a esto en Erlang, ya que buscar en Google "Erlang ask operation" o simplemente "Erlang ask" produce resultados menos que útiles.


El ? en Akka está construido usando ! . Lo que hace es: ¡Crea un nuevo actor temporal que se utiliza como sender para un mensaje que se envía usando ordinario ! . Si no recibe nada a tiempo, establece la promesa de fallar. Si lo hace cumple la promesa.

El actor preguntado responderá a ese actor temporal (que es cómo usted sabe qué mensaje fue realmente respondido, de lo contrario tendría que hacer un seguimiento de usted en un mapa o algo similar).

Es por eso que tiene que importar el patrón ask explícitamente y por qué se llama patrón, ¡no como primitiva ! es.

Podría implementar el mismo patrón en Erlang.


Erlang no admite promesas ni futuros. Vea esta pregunta para otros ejemplos de cómo simularlos. Consulte también este artículo para obtener una explicación de por qué Erlang utiliza el mensaje de pase en lugar de promesas y futuros.