92 Stimmen

Wie / warum skaliert funktionale Sprachen (insbesondere Erlang) gut?

Ich beobachte seit geraumer Zeit die wachsende Sichtbarkeit funktionaler Programmiersprachen und -funktionen. Ich habe sie mir angesehen und sehe den Grund für ihre Anziehungskraft nicht.

Vor Kurzem habe ich jedoch Kevin Smiths Präsentation "Grundlagen von Erlang" auf Codemash besucht.

Ich habe die Präsentation genossen und erfahren, dass viele der Eigenschaften funktionaler Programmierung es erleichtern, Thread-/Concurrency-Probleme zu vermeiden. Mir ist bekannt, dass das Fehlen von Zustand und Veränderbarkeit es unmöglich macht, dass mehrere Threads dieselben Daten ändern, aber Kevin sagte (wenn ich es richtig verstanden habe), dass alle Kommunikation über Nachrichten erfolgt und die Nachrichten synchron verarbeitet werden (auch hier werden Konflikte vermieden).

Aber ich habe gelesen, dass Erlang in hoch skalierbaren Anwendungen verwendet wird (der Hauptgrund, warum Ericsson es überhaupt erst erstellt hat). Wie kann es effizient sein, Tausende von Anfragen pro Sekunde zu verarbeiten, wenn alles als synchron verarbeitete Nachricht behandelt wird? Ist das nicht der Grund, warum wir begonnen haben, uns in Richtung asynchroner Verarbeitung zu bewegen - um den Vorteil zu nutzen, mehrere Threads gleichzeitig ausführen zu können und Skalierbarkeit zu erzielen? Es scheint, als ob diese Architektur, obwohl sicherer, einen Schritt rückwärts in Bezug auf Skalierbarkeit darstellt. Was übersehe ich?

Ich verstehe, dass die Schöpfer von Erlang bewusst vermieden haben, Multithreading zu unterstützen, um Konflikte zu vermeiden, aber ich dachte, dass Multithreading notwendig sei, um Skalierbarkeit zu erreichen.

Wie können funktionale Programmiersprachen von Natur aus threadsicher sein und dennoch skalieren?

1 Stimmen

[Not mentioned]: Erlangs' VM bringt Asynchronität auf eine andere Ebene. Durch Voodoo-Magie (asm) ermöglicht es synchrone Operationen wie socket:read zu blockieren, ohne einen Betriebssystem-Thread anzuhalten. Dies ermöglicht es Ihnen, synchronen Code zu schreiben, wenn andere Sprachen Sie in async-callback-Verschachtelungen zwingen würden. Es ist viel einfacher, eine skalierbare App mit dem Bild eines single-threaded Microservices im Kopf zu schreiben, anstatt jedes Mal das große Ganze im Blick zu behalten, wenn Sie etwas zum Code hinzufügen.

0 Stimmen

@Vans S Interessant.

4voto

Jebu Punkte 41

Erlang-Nachrichten sind rein asynchron, wenn Sie eine synchrone Antwort auf Ihre Nachricht wünschen, müssen Sie explizit dafür programmieren. Möglicherweise wurde gesagt, dass Nachrichten in einer Prozessnachrichtenbox sequenziell verarbeitet werden. Jede an einen Prozess gesendete Nachricht sitzt in dieser Prozessnachrichtenbox, und der Prozess wählt eine Nachricht aus dieser Box aus, verarbeitet sie und geht dann zur nächsten über, in der Reihenfolge, die er für angemessen hält. Dies ist eine sehr sequenzielle Handlung, und der Empfangsblock tut genau das.

Sie haben wohl synchron und sequenziell verwechselt, wie Chris erwähnt hat.

3voto

Kristopher Johnson Punkte 78933

-2voto

mfx Punkte 6908

In einer rein funktionalen Sprache spielt die Reihenfolge der Auswertung keine Rolle - bei einer Funktionsanwendung fn(arg1, .. argn) können die n Argumente parallel ausgewertet werden. Das garantiert ein hohes Maß an (automatischem) Parallelismus.

Erlang verwendet ein Prozessmodell, bei dem ein Prozess in derselben virtuellen Maschine oder auf einem anderen Prozessor ausgeführt werden kann - es gibt keine Möglichkeit, dies zu unterscheiden. Das ist nur möglich, weil Nachrichten zwischen Prozessen kopiert werden, es gibt keinen gemeinsamen (veränderbaren) Zustand. Multiprozessor-Parallelismus geht viel weiter als Multithreading, da Threads auf gemeinsamem Speicher basieren, so dass nur 8 Threads gleichzeitig auf einer 8-Kern-CPU laufen können, während Multiprozessoren auf Tausende parallele Prozesse skalieren können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X