2009-02-01 14 views
16

me di cuenta el siguiente comentario en mi copia de Expertos de F # en la página 379:Procesador Buzón sobre Sistemas Distribuidos

fallecimiento y procesar mensajes

A menudo se distingue entre de memoria compartida concurrencia y mensaje pasando la concurrencia. El primero es a menudo más eficiente en máquinas locales y se trata en la sección "Uso de Concurrencia de memoria compartida" más adelante en en este capítulo. Este último se amplía a los sistemas donde no hay memoria compartida , por ejemplo, sistemas distribuidos , y también se puede usar para evitar los problemas de rendimiento asociados con la memoria compartida .

Me interesa el mensaje que pasa la concurrencia entre procesos sin memoria compartida. Todos los ejemplos en Experto F # y en Internet que muestran cómo utilizar el MailboxProcessor contiene alguna variación de este código:

let counter = 
    MailboxProcessor.Start(fun inbox -> 
     let rec loop n = 
      async { 
       do printfn "n = %d, waiting... " n 
       let! msg = inbox.Receive() 
       match msg with 
        | -1 -> 
         do printfn "'Til the bitter end..." 
         return() 
        | n -> return! loop(n + msg) 
      } 
     loop 0) 

counter.Post(20) 
counter.Post(50) 
counter.Post(-1) // kill mailbox 

En otras palabras, usted tiene que tener una manija en su MailboxProcessor en memoria compartida antes puedes publicar mensajes en su canal. Por lo que yo sé, esto no es concurrencia al estilo de Erlang, ya que solo se pueden publicar mensajes en MailboxProcessors en el mismo proceso (nota: procesar, no enhebrar).

¿Es posible que un MailboxProcessor en un proceso envíe mensajes a otro proceso de MailboxProcessor? Si es así, ¿podría proporcionar una muestra?

Respuesta

8

Creo que ha estado un poco confundido por la terminología. Los procesos de Erlang no necesariamente se corresponden directamente con los procesos del sistema operativo. Un proceso de SO determinado puede tener múltiples procesos de Erlang (y generalmente lo hace), al igual que su proceso tiene múltiples hilos. Si desea comunicarse entre múltiples procesos del sistema operativo, es posible que desee comprobar System.Runtime.Remoting.Channels.Ipc. Es concebible que se pueda crear un contenedor estilo BuzónProcesador alrededor de estas API.

8

El MailboxProcessor y AsyncReplyChannel no proporcionan la misma transparencia de ubicación que la operación "pid bang" (Pid!) En Erlang. Por supuesto, esto solo funciona cuando los nodos de Erlang distribuidos están configurados correctamente, es decir, nombres, DNS, módulos sincronizados, cookies, etc. Hay algunas características en OTP para facilitar esta administración. Por supuesto, si los procesos de Erlang están en el mismo nodo, simplemente funciona. Pero, hay algunas arrugas con Erlang distribuido.

"La red es segura." Los mecanismos de Erlang distribuidos incorporados suponen que la red es segura. Por lo tanto, se utiliza un enfoque de comunicación basado en sockets con procesos proxy Erlang cuando la seguridad es necesaria.

"La red es confiable." Una de las cosas que hace que Erlang distribuido funcione es su filosofía de manejo de errores, a saber, que los procesos no son confiables y, por lo tanto, la tolerancia a fallas solo se logra comunicando monitores de proceso. OTP codifica patrones (es decir, Supervisor) para implementar esta filosofía. Los mensajes confiables en Erlang se pueden lograr a través de Mnesia (una base de datos distribuida), como se hizo en RabbitMQ, pero no se obtiene de la caja.

Al final, las comunicaciones distribuidas nunca son tan fáciles. Podríamos implementar un AsynchWorker en F # para que actúe como nuestro proxy y se comunique con él a través de AsynchReplyChannel.Send. Todavía tenemos que pensar en las falacias de la informática distribuida.

Finalmente, la concurrencia de estilo de paso de mensajes no implica comunicación fuera del proceso. Implica que no hay un estado compartido para administrar con bloqueos, por lo tanto, un modelo de cómputo paralelo más simple y menos propenso a errores. Creo que este Prime Number Sieve es un gran ejemplo de este estilo de concurrencia. El ejemplo de F # no es tan estéticamente agradable como la implementación de Squeak o Erlang, debido a la falta de sintaxis incorporada para la transmisión de mensajes, pero funciona.

1

Tal vez esto va a hacer

Map Reduce with F# agents

no he recibido mucha retroalimentación por lo que no seguro de su 100% correcto. Si crees que es malo, por favor, házmelo saber.

¡Gracias!

Cuestiones relacionadas