2009-02-01 3 views
16

Ich bemerkte den folgenden Kommentar in mein Exemplar von Expert F # auf Seite 379:Mailbox Processor auf verteilte Systeme

Passing und Nachrichten zu verarbeiten

Man unterscheidet oft zwischen Shared-Memory gemacht Nebenläufigkeit und Nachricht vorübergehende Nebenläufigkeit. Ersteres ist oft effizienter auf lokalen Maschinen und wird im Abschnitt "Verwenden von Shared-Memory Concurrency" später in dieses Kapitel behandelt. Letzteres skaliert zu Systemen, in denen es keine gemeinsame Speicher gibt, zum Beispiel verteilt Systeme, und kann auch verwendet werden, um Leistungsprobleme mit gemeinsamen Speicher verbundenen zu vermeiden.

Ich bin interessiert Nachricht Weitergabe von Nebenläufigkeit zwischen Prozessen ohne gemeinsamen Speicher. Alle Beispiele in Expert F # und im Internet, die zeigen, wie die MailboxProcessor verwenden eine gewisse Variation dieses Codes enthalten:

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 

Mit anderen Worten, müssen Sie haben einen Griff auf Ihrem MailboxProcessor in Shared-Memory vor Sie können Nachrichten an seinen Kanal senden. Dies ist, soweit ich weiß, keine Parallelität im Erlang-Stil, da Sie Nachrichten nur im gleichen Prozess an MailboxProcessors senden können (Hinweis: Prozess, nicht Thread).

Ist es möglich, dass ein MailboxProcessor in einem Prozess Nachrichten an einen anderen MailboxProcessor-Prozess sendet? Wenn ja, könnten Sie eine Probe zur Verfügung stellen?

Antwort

8

Ich denke, Sie waren ein bisschen durch die Terminologie verwirrt. Erlang-Prozesse entsprechen nicht notwendigerweise direkt OS-Prozessen. Ein bestimmter Betriebssystemprozess kann mehrere Erlang-Prozesse haben (und tut dies normalerweise), ähnlich wie Ihr Prozess mehrere Threads hat. Wenn Sie zwischen mehreren Betriebssystemprozessen kommunizieren möchten, sollten Sie sich die folgende Tabelle ansehen: System.Runtime.Remoting.Channels.Ipc. Möglicherweise könnte ein MailboxProcessor-artiger Wrapper um diese APIs erstellt werden.

8

Der MailboxProcessor und AsyncReplyChannel bieten nicht die gleiche Standorttransparenz wie die Operation "Pidbang" (Pid!) In Erlang. Natürlich funktioniert dies nur, wenn die verteilten Erlang-Knoten richtig konfiguriert sind, d. H. Namen, DNS, synchronisierte Module, Cookies usw. Es gibt einige Merkmale in OTP, um diese Verwaltung zu vereinfachen. Wenn sich die Erlang-Prozesse auf demselben Knoten befinden, funktioniert es natürlich. Aber es gibt einige Falten mit verteilten Erlang.

"Das Netzwerk ist sicher." Die integrierten verteilten Erlang-Mechanismen gehen davon aus, dass das Netzwerk sicher ist. Daher wird ein Socket-basierter Kommunikationsansatz mit Proxy-Erlang-Prozessen eingesetzt, wenn Sicherheit erforderlich ist.

"Das Netzwerk ist zuverlässig." Eines der Dinge, die verteiltes Erlang zum Funktionieren bringen, ist seine Philosophie der Fehlerbehandlung, nämlich dass Prozesse unzuverlässig sind und Fehlertoleranz daher nur durch Kommunikation von Prozessmonitoren erreicht wird. OTP codiert Muster (d. H. Supervisor), um diese Philosophie zu implementieren. Zuverlässiges Messaging in Erlang kann über Mnesia (eine verteilte Datenbank) erreicht werden, wie es in RabbitMQ gemacht wurde, aber Sie erhalten es nicht sofort aus der Box.

Am Ende ist verteilte Kommunikation nie so einfach. Wir könnten einen AsynchWorker in F # implementieren, um als unser Proxy zu fungieren und mit ihm über AsynchReplyChannel.Send zu kommunizieren. Wir müssen immer noch über die Irrtümer des verteilten Rechnens nachdenken.

Schließlich bedeutet die Gleichzeitigkeit von Nachrichtenübergaben keine improvisierte Kommunikation. Es impliziert, dass es keinen gemeinsamen Zustand gibt, um mit Sperren zu verwalten, also ein einfacheres, weniger fehleranfälliges Modell der parallelen Berechnung. Ich denke, diese Prime Number Sieve ist ein großartiges Beispiel für diese Art von Nebenläufigkeit. Das F # -Beispiel ist nicht so ästhetisch ansprechend wie die Squeak- oder eine Erlang-Implementierung, da es keine integrierte Syntax für die Nachrichtenübermittlung gibt, aber es funktioniert.

1

Vielleicht wird dies tun

Map Reduce with F# agents

ich nicht viel Feedback bekommen haben, so nicht sicher, dass seine 100% richtig. Wenn Sie es für schlecht halten, lassen Sie es mich bitte wissen.

Vielen Dank!