Ich möchte, wie können wir Produzenten / Konsumenten in einer funktionalen Programmiersprache wie Haskell implementieren? und wie wird es sich von einer Imperativ-Sprache unterscheiden? Mein Verständnis der funktionalen Programmiersprache ist primitiv. Jede Hilfe wird geschätzt.
Eine Producer / Consumer-Abstraktion, die preemptive Threads und Nachrichten verwendet, die durch einen Channel laufen:
%Vor%Sie würden ein ähnliches Modell in Erlang verwenden. Threads zur Darstellung des Verbrauchers und des Produzenten und eine gemeinsame Pipeline von Nachrichten zwischen ihnen, die jeweils asynchron agieren.
Ich füge zu dons
's ausgezeichnete Antwort hinzu, dass der zugrunde liegende Mechanismus hier etwas ist, das MVar
genannt wird, und es ist ein imperativer, paralleler Container für einen Wert. Sie "putten" und "bekommen" in und aus einer MVar. Einen leeren MVar-Block zu bekommen, genauso wie einen vollen zu setzen. Es ist gleichzeitig ein Kommunikationsmechanismus und ein Synchronisationsmechanismus. Ich glaube, es wurde von Arvind im Rahmen des Monsoon / * t-Projekts erfunden. Es gibt eine schöne Buch von Nikhil and Arvind erklärt ihren pH-Dialekt von parallelem Haskell. Viele der Ideen wurden in GHC übernommen und das Buch ist lesenswert.
Neben den Stateful-Ansätzen, die von Norman und Don erwähnt werden, können Sie auch an normale Funktionsanwendung und Faulheit als Produzenten und Verbraucher denken.
Hier ist ein Produzent für die natürlichen Zahlen:
%Vor%Und hier ist ein Verbraucher, der die Quadrate dieser Zahlen berechnet:
%Vor% Hersteller wie yield return
in C # oder Generatoren in Python können oft so ausgedrückt werden: als einfache faule Listen in Haskell.
Tags und Links haskell multithreading design concurrency functional-programming