Frage

Es gibt eine Menge Buzz in diesen Tagen über keine Sperren und mit der Nachricht vorbei Ansätze wie Erlang verwendet wird. Oder über die Verwendung von unveränderlichen Datenstrukturen wie in Funktionale Programmierung vs. C ++ / Java.

Aber was ich bin besorgt darüber, mit ist die folgende:

  1. AFAIK, wird Erlang nicht Nachrichtenübermittlung garantieren. Nachrichten können verloren gehen. Wird nicht der Algorithmus und Code aufblasen und kompliziert wieder, wenn Sie über den Verlust von Nachrichten zu kümmern? Was auch immer verteilten Algorithmus Sie verwenden, muss nicht auf die garantierte Zustellung von Nachrichten ab.
  2. Was passiert, wenn die Nachricht ist ein kompliziertes Objekt? Gibt es nicht eine große Leistungseinbuße beim Kopieren und Senden der Nachrichten vs. sagen, dass es in einer gemeinsamen Position zu halten (wie ein DB, dass beiden Prozesse zugreifen können)?
  3. Können Sie wirklich völlig abschaffen geteilt Staaten? Ich glaube nicht. Für z.B. in einem DB, müssen Sie denselben Datensatz zugreifen und diese ändern. Sie können Nachricht nicht, dass es vorbei verwenden. Sie müssen Sperren haben oder Parallelität Kontrollmechanismen übernehmen und dann tun Rollbacks auf Fehler. Wie funktioniert Mnesia arbeiten?
  4. Auch ist es nicht der Fall, dass Sie immer über die Parallelität zu kümmern. Jedes Projekt wird auch ein großes Stück Code, der nicht mit Gleichzeitigkeit oder Transaktionen überhaupt nichts zu tun hat (aber sie haben die Leistung und Geschwindigkeit als Problem). Viele dieser Algorithmen sind abhängig von gemeinsam genutzten Staaten (deshalb pass-by-reference oder Zeiger sind so nützlich).

diese Tatsache gegeben, Programme in Erlang zu schreiben usw. ist ein Schmerz, weil Sie zu tun, alle diese Dinge vermieden werden. Mag sein, macht es Programme robust, aber für Dinge wie ein Linear Programming Problem zu lösen, oder die Berechnung der konvexe hulll usw. Leistung wichtiger ist, und zwingt Unveränderlichkeit usw. auf dem Algorithmus, wenn es nichts mit Concurrency / Transaktionen zu tun hat, ist eine schlechte Entscheidung . Ist es nicht?

War es hilfreich?

Lösung

  1. Das ist die wirkliche Leben : Sie müssen für diese Möglichkeit berücksichtigen, unabhängig von der Sprache / Plattform. In einer verteilten Welt (die reale Welt), die Dinge fehlschlagen: mit ihnen leben

  2. .
  3. Natürlich gibt es ein Kosten : nichts in unserem Universum ist kostenlos. Aber sollen Sie nicht ein anderes Medium verwenden (zum Beispiel Datei, db) anstelle von „großen Objekten“ in Kommunikationsleitungen pendeln? Sie können „Nachricht“ immer auf „große Objekte“ irgendwo gespeichert beziehen.

  4. Natürlich nicht: Die Idee hinter dem funktionalen Programmierung / Erlang OTP ist auf „ Isolat “ so weit wie möglich wurden die Bereiche „gemeinsamer Staat“ manipuliert. Futhermore, nachdem deutlich gekennzeichnet Orte in dem gemeinsam genutzten Zustand mutiert ist, hilft Testbarkeit und Nachvollziehbarkeit.

  5. Ich glaube, Sie fehlen den Punkt: es gibt nicht so etwas wie eine silberne Kugel ist. Wenn Ihre Anwendung nicht erfolgreich Erlang gebaut werden kann, verwenden, dann tut es nicht. Sie können einige andere Teil des Gesamtsystems immer in einer anderen Art und Weise das heißt eine andere Sprache / Plattform verwenden. Erlang unterscheidet sich nicht von einer anderen Sprache in dieser Hinsicht. verwenden Sie das richtige Werkzeug für den richtigen Job

Denken Sie daran: Erlang wurde entwickelt, um zur Lösung gleichzeitig , asynchronen und verteilt Probleme. Es ist nicht für die Arbeit effizient auf einem gemeinsamen Speicherblock zum Beispiel optimiert ... es sei denn, Sie mit nif Funktionen arbeiten an gemeinsamen Blöcken Teil des Spiels Zählung Schnittstellen: -)

Andere Tipps

Reale Systeme sind sowieso immer Hybriden . Ich glaube nicht, die modernen Paradigmen versuchen, in der Praxis, um loszuwerden, veränderbarer Daten und gemeinsam genutzten Zustand

Das Ziel ist jedoch nicht gleichzeitigen Zugriff auf diesen freigegebenen Zustand zu müssen. Die Programme können in die gleichzeitigen und den sequentiellen und Verwendung Message-Passing und die neuen Paradigmen für die gleichzeitigen Teile aufgeteilt werden.

Nicht jeder Code wird die gleiche Investition erhalten : Es besteht die Sorge, die Fäden im Grunde „als schädlich“ sind. So etwas wie Apache kann traditionelle gleichzeitige Threads benötigen und ein Kernstück der Technologie wie die über einen Zeitraum von Jahren sorgfältig verfeinert werden kann, so dass es mit völlig gleichzeitigen gemeinsamen Staat sprengen kann. Betriebssystem-Kernel sind ein weiteres Beispiel, in dem „das Problem zu lösen, egal wie teuer es ist,“ kann sinnvoll sein.

Es gibt keinen Nutzen für die schnell aber gebrochen : Aber für neuen Code oder Code, der nicht so viel Aufmerksamkeit bekommt, kann es der Fall sein, dass es nicht einfach ist thread- sicher, und es wird nicht wahr Gleichzeitigkeit, handhaben und so die relative „Effizienz“ ist dabei unerheblich. Ein Weg funktioniert, und ein Weg, dies nicht tut.

nicht Testbarkeit vergessen: Auch, welchen Wert können Sie auf Tests setzen? Thread-basierten Shared-Memory-Parallelität ist einfach nicht prüfbar. Message-Passing Gleichzeitigkeit ist. So, jetzt haben Sie die Situation, wo Sie ein Paradigma testen können, aber nicht die andere. Also, was ist der Wert in dem Wissen, dass der Code getestet wurde? Die Gefahr, in nicht einmal wissen, ob der anderen Code in jeder Situation funktionieren wird?

Es gibt einige implizite Annahme in Ihren Fragen - Sie davon ausgehen, dass alle Daten passen auf einer Maschine und dass die Anwendung an sich lokalisiert an einen Ort.

Was passiert, wenn die Anwendung so groß ist, es nicht auf einer Maschine passen? Was passiert, wenn die Anwendung eine Maschine entwächst?

Sie wollen nicht einen Weg, um eine Anwendung zu programmieren, wenn es auf einer Maschine paßt und eine ganz andere Art und Weise es so schnell zu programmieren, wie es eine Maschine entwächst.

Was passiert, wenn Sie eine fehlertolerante Anwendung machen wollen? Um etwas fehlertoleranter benötigen Sie mindestens zwei physikalisch getrennte Maschinen und keinen Teil . Wenn Sie über das Teilen und Datenbanken sprechen auslassen Sie, dass Dinge wie mySQL zu erwähnen Cluster erreichen fehler-Toleranz genau durch synchronisierte Kopien der Aufrechterhaltung physikalisch getrennte Maschinen Daten in - es gibt eine Menge von Message Passing und Kopieren, die Sie nicht auf der Oberfläche sehen - Erlang macht genau dies.

Die Art und Weise Programm soll die Fehlertoleranz und Skalierbarkeit zur Aufnahme nicht plötzlich ändern.

Erlang wurde in erster Linie konzipiert für den Aufbau von fehlertoleranten Anwendungen.

Gemeinsame Daten auf einem Multi-Core hat ist es eigenen Probleme - wenn Sie gemeinsam genutzte Daten zugreifen Sie müssen eine Sperre erhalten - wenn Sie eine globale Sperre (die einfachste Ansatz) verwenden, können Sie am Ende Stoppen Sie alle Kerne, während Sie auf die freigegebenen Daten zugreifen. Gemeinsamer Datenzugriff auf einem Multicore kann aufgrund Caching Probleme problematisch sein, wenn die Kerne dann lokalen Daten-Caches haben „weit weg“ Daten (in einem anderen Prozessor Cache) zugreifen, kann sehr teuer sein.

Viele Probleme sind eng verteilt und die Daten nie an einem Ort verfügbar zugleich so - diese Art von Problemen paßt gut mit der Erlang Denkweise

.

In einer verteilten Umgebung „garantiert die Nachrichtenübermittlung“ ist unmöglich - die Zielmaschine abgestürzt sein könnte. Erlang kann somit nicht die Nachrichtenübermittlung garantieren - es hat einen anderen Ansatz - das System wird Ihnen sagen, wenn es eine Nachricht zu über gescheitert (Aber nur, wenn Sie den Verbindungsmechanismus verwendet haben) - dann können Sie schreiben, besitzen Sie benutzerdefinierte Fehler Genesung.)

Für die reine Anzahl Erlang Knirschen nicht geeignet ist - aber in einem Hybridsystem Erlang ist gut zu verwalten, wie Berechnungen verfügbare Prozessoren verteilt bekommen, so dass wir viele Systeme sehen, wo Erlang der Verteilung und fehler tolerent Aspekte des Problems schafft, aber das Problem selbst gelöst in einer anderen Sprache.

und andere Sprachen verwendet werden,

Ein paar Bemerkungen zu dem Missverständnis Sie von Erlang haben:

  • Erlang garantiert, dass Nachrichten nicht verloren gehen, und dass sie in der Reihenfolge gesendet ankommen werden. Eine grundlegende Fehlersituation ist, dass Maschine A nicht zu Maschine B sprechen kann, wenn dieser Prozess überwacht geschieht und Verbindungen auslösen und Systemknoten-down-Nachrichten werden an die Prozesse gesendet werden, die für ihn registriert. Nichts wird sofort gelöscht. Prozesse „Crash“ und Vorgesetzte (falls vorhanden) versucht, sie neu zu starten.
  • Objekte können nicht mutiert werden, so dass sie immer kopiert. Eine Möglichkeit, Unveränderlichkeit zu sichern, ist durch Werte zu anderen erlang Prozess Haufen zu kopieren. Eine weitere Möglichkeit ist es, Objekte in einem gemeinsam genutzten Heap, Nachrichten Verweise auf sie zu verteilen und einfach keine Operationen, die sie mutieren. Erlang hat die erste für die Leistung! Echtzeit leidet, wenn Sie alle Prozesse Müll stoppen müssen, um einen gemeinsam genutzten Heap-collect. Stellen Sie Java.
  • Es wird geteilt Zustand in Erlang. ist Erlang es nicht stolz, aber es ist pragmatisch darüber. Ein Beispiel hierfür ist der lokale Prozess-Registry, die eine globale Karte ist, die Karten einen Namen zu einem Prozess, so dass Systemprozesse neu gestartet werden können und ihre alten Namen beanspruchen. Erlang nur versucht, gemeinsam genutzten Zustand zu vermeiden, wenn nur irgend möglich . ETS-Tabellen, die öffentlich sind, sind ein weiteres Beispiel.
  • Ja, manchmal Erlang ist zu langsam. Dies geschieht alle Sprachen. Manchmal Java ist zu langsam. Manchmal ist C ++ zu langsam. Nur weil eine enge Schleife in einem Spiel bis zu Montage fallen mußte einig schwere SIMD-basierte Vektormathematik kick off kann man nicht ableiten soll, dass alles in Assembler geschrieben werden, weil es die einzige Sprache ist, die schnell ist, wenn es darauf ankommt. Was zählt, ist in der Lage zu sein Systeme zu schreiben, die gute Leistung und Erlang schafft ganz gut. Siehe Benchmarks auf giert oder rabbitmq.

Ihre Fakten sind nicht Fakten über Erlang. Auch wenn Sie Erlang Programmierung denken ein Schmerz ist, werden Sie andere Menschen einige tolle Software dank es schaffen finden. Sie sollten versuchen, einen IRC-Server in Erlang, oder etwas anderes sehr gleichzeitiges Schreiben. Selbst wenn Sie nie Erlang wieder in Gang zu verwenden, würden Sie gelernt, über Gleichzeitigkeit eine andere Art und Weise zu denken. Aber natürlich, man will, weil Erlang ist genial einfach.

Diejenigen, die Erlang nicht verstehen, sind dazu verdammt, sie schlecht neu zu implementieren.

Okay, das Original war über Lisp, aber ... es ist wahr!

  

Für z.B. in einem DB, müssen Sie denselben Datensatz zugreifen und diese ändern

Aber das wird von der DB behandelt. Als Nutzer der Datenbank, führen Sie einfach Ihre Anfrage und die Datenbank stellt sicher, es in Isolation ausgeführt wird.

Was die Leistung, eines der wichtigsten Dinge über Staat geteilt Eliminieren ist, dass es neue Optimierungen ermöglicht. Gemeinsamer Zustand ist nicht besonders effizient. Sie erhalten Kerne über die gleichen Cache-Zeilen zu kämpfen, und Daten haben durch den Speicher geschrieben werden, wo es sonst in einem Register oder in CPU-Cache bleiben kann.

Viele Compiler-Optimierungen beruhen auf Fehlen von Nebenwirkungen und gemeinsam genutzten Zustand als gut.

Man könnte sagen, dass eine strengere Sprache, diese Dinge zu garantieren mehr Optimierungen erfordert seine performant als so etwas wie C, aber es macht auch diese Optimierungen viel viel einfacher für die Compiler zu implementieren.

Viele Bedenken ähnlich wie Concurrency Probleme entstehen in singlethreaded Code. Moderne CPUs sind Pipeline-Anweisungen ausführen aus Ordnung und kann 3-4 von ihnen pro Zyklus ausgeführt werden. So auch in einem Singlethread-Programm, ist es wichtig, dass der Compiler und CPU in der Lage ist, zu bestimmen, welche Befehle verschachtelt und parallel ausgeführt werden können.

  1. bietet Erlang Supervisoren und gen_server Rückrufe für synchrone Anrufe, so dass Sie es wissen, wenn eine Nachricht nicht zugestellt wird: entweder der gen_server Anruf ein Timeout zurückgibt, oder den ganzen Knoten wird gebracht und, wenn der Supervisor ausgelöst wird .
  2. in der Regel, wenn die Prozesse auf dem gleichen Knoten sind, Message-Passing-Sprachen optimieren die Datenkopier weg, so ist es fast wie Shared Memory, mit der Ausnahme, wenn das Objekt durch beide später geändert wird verwendet, die nicht entweder Shared-Memory getan werden kann, sowieso
  3. Es gibt einige Zustand, der es sich um durch Prozesse gehalten wird in den rekursiven Schwanz-Anrufe an sich vorbei, auch können einige Zustand natürlich durch Nachrichten weitergegeben werden. Ich Mnesia nicht verwenden viel, aber es ist eine Transaktionsdatenbank, so dass, sobald Sie die Operation vergangen Mnesia (und es zurückgegeben hat) Sie ziemlich garantiert sind, werden sie durchlaufen ..
  4. , weshalb es einfach ist, solche Anwendungen in erlang mit dem Einsatz von Ports oder Treiber zu binden. Am einfachsten sind die Ports, ist es viel wie ein Unix-Rohr, obwohl ich denke, die Leistung ist nicht so toll ... und wie gesagt, Message-Passing endet in der Regel bis nur Zeiger ist sowieso als Compiler VM / geben optimieren, um die Speicherkopie .

Für die Richtigkeit, geteilt ist der Weg zu gehen, und die Daten bleiben so weit wie möglich normalisiert. Für Unmittelbarkeit, Nachrichten senden über Änderungen zu informieren, sondern sie immer mit Polling sichern. Meldungen gelöscht, dupliziert, nachbestellt, verzögert -. Nicht auf sie verlassen

Wenn die Geschwindigkeit ist, was Sie sind besorgt über, zuerst tun es Single-Thread und tune die daylights aus ihm . Dann, wenn Sie mehrere Kerne haben und wissen, wie die Arbeit aufzuteilen, verwenden Parallelität.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top