2009-06-05 10 views
46

Ich bin verwirrt über den Begriff "Funken"Was ist ein "Funke" in Haskell

Ist es ein Thread in Haskell? Oder wird ein neuer Thread erzeugt?

Dank jedermann:

So zusammenzufassen, Funken Faden nicht aber mehr der Einheit der Berechnung (Aufgaben, die es in C#/Java Begriffe zu setzen). Es ist also die Haskell-Methode, die Aufgabenparallelität zu implementieren.

Antwort

32

Siehe A Gentle Introduction to Glasgow Parallel Haskell.

Parallelismus wird durch die par combinator in GPH eingeführt, die zwei Argumente übernimmt, die parallel ausgewertet werden sollen. Der Ausdruck p `par` e (hier verwenden wir die Haskell-Infix-Operatornotation) hat den gleichen Wert wie e und ist in seinem ersten Argument nicht streng, d. H. bottom `par` e hat den Wert e. (bottom bezeichnet eine nicht terminierende oder fehlgeschlagene Berechnung.) Sein dynamisches Verhalten soll anzeigen, dass durch einen neuen parallelen Thread ausgewertet werden konnte, mit der fortlaufenden Bewertung des übergeordneten Threads von e. Wir sagen, dass wurde ausgelöst, und ein Thread kann anschließend erstellt werden, um es auszuwerten, wenn ein Prozessor im Leerlauf wird. Da der Thread nicht unbedingt erstellt wird, ähnelt einem faul Zukunft.

[Hervorhebung im Original]

+1

Wie ich es gelesen habe, ist ein "Funke" nicht so sehr ein Thread als eine Berechnung, die in einem Thread ausgeführt werden kann. Die Laufzeit könnte eine feste Obergrenze für Threads haben, die sich durch Funken drehen und diese auswerten. – ephemient

+1

Dies ist nicht korrekt. Funken sind keine Fäden. GHC unterstützt Funken, die nicht evaluierte Berechnungen in einer Warteschlange, Haskell (Lightweight Threads) und OS-Threads sind. –

87

Sparks sind nicht Threads. forkIO führt Haskell-Threads ein (die auf weniger echte OS-Threads abbilden). Sparks erstellt Einträge in den Arbeitswarteschlangen für jeden Thread, von denen sie Aufgaben ausführen, wenn der Thread inaktiv wird.

Als Ergebnis sind Funken sehr billig (Sie könnten Milliarden davon in einem Programm haben, während Sie wahrscheinlich nicht mehr als eine Million Haskell-Threads und weniger als ein Dutzend OS-Threads auf einem halben Dutzend Kerne haben).

Betrachten Sie es wie folgt aus:

spark model

+0

Hast du das Bild von hier aufgenommen: http://expcodes.com/125624? Einige Zuschreibungen können nett sein. –

+37

@phresnel Dies ist eine Originalarbeit von mir, erstellt für diese Frage, mit Inkscape. Ihr Link verwendet meine Arbeit tatsächlich ohne Zuordnung - wie Sie sehen können, wenn ich das Datum des Inhalts ansehe. –

+4

Ich sehe; Ich habe mich meistens gefragt, warum der verlinkte Inhalt anscheinend eine größere Auflösung hat.Mein Fehler, nicht auf Datum zu sehen, danke für die Klarstellung :) –

3

Wenn ich es richtig verstanden habe, ein Funke ist ein Eintrag in einer Warteschlange von Jobs erfordern Arbeit. Ein Thread-Pool nimmt Einträge aus dieser Warteschlange und führt sie aus. In der Regel gibt es einen Thread pro physischem Prozessor, sodass dieses Schema den Durchsatz maximiert und die Threadkontextumschaltung minimiert.

0

Es sieht aus wie eine "Aufgabe" in Intel Threading Building Blocks.

+0

Ich würde ein +1 geben, aber ich habe das Gefühl, dass es ein wenig mehr braucht, um eine Antwort zu sein, da es eher wie ein Kommentar aussieht. Fügen Sie ein paar Links hinzu und diskutieren Sie, wie die Konzepte ähnlich sind, mit dem Fokus, uns dabei zu helfen, Sparks spezifisch zu verstehen. – derekv