Frage

Ich habe vor kurzem fertig Buch Joe und ganz genossen. Ich bin dann da begann mit erlang eine weiche Echtzeit-Anwendung Codierung und ich muß sagen, ich bin ein bisschen bei der Verwendung von gen_server verwechselt.

Wann soll ich gen_server anstelle einer einfachen staatenlos Modul verwenden? I definieren eine zustandslose Modul wie folgt: - Zustand als Parameter (ähnlich wie ETS / DETS) im Gegensatz zu intern zu halten (wie gen_server)

Ein Modul, das es braucht

Say für eine Rechnung Manager-Typ-Modul, sollte es initialisieren und die Rück Zustand, den ich dann später, um es passieren würde? SomeState = InvoiceManager: init (), SomeState = InvoiceManager. AddInvoice (SomeState, AnInvoiceFoo)

Angenommen, ich mehrere Instanzen des Rechnungs Manager Zustand bräuchten (sagen meine Anwendung mehrere Unternehmen jeweils mit ihren eigenen Rechnungen verwaltet), sollten sie jeweils eine gen_server mit internen Zustand haben ihre Rechnungen zu verwalten oder wäre es besser passen einfach haben das staatenlos Modul oben?

Wo ist die Grenze zwischen den beiden?

(Beachten Sie die Rechnung verwalten Beispiel oben ist nur, dass ein Beispiel, meine Frage zu erläutern)

War es hilfreich?

Lösung

Es hängt stark von Ihren Bedürfnissen und Anwendungsdesign. Wenn Sie gemeinsam genutzte Zustand zwischen Prozessen benötigen haben Sie Prozess zu verwenden, um diesen Zustand zu halten. Dann gen_server, gen_fsm oder andere gen_* ist dein Freund. Sie können diesen Entwurf vermeiden, wenn die Anwendung nicht gleichzeitig ist oder dieser Entwurf nicht Sie einige andere Vorteile mit sich bringen. Zum Beispiel bricht Ihre Anwendung Prozesse zu einfacherem Design führen. In einem anderen Fall kann man manchmal einzelne Prozess-Design und mit „stateless“ Module für die Leistung oder so wählen. „Stateless“ -Modul ist die beste Wahl für sehr einfach staatenlos (rein funktional) Aufgaben. gen_server ist oft die beste Wahl für denkt, dass scheint natürlich „Prozess“. Sie müssen es verwenden, wenn Sie etwas zwischen Prozessen wollen teilen (Prozesse verwenden, können durch Skalierbarkeit oder Gleichzeitigkeit eingeschränkt werden).

Andere Tipps

Ich glaube nicht wirklich, dass Sie Unterschied zwischen machen, was man einen staatenlos Modul und gen_server nennen. In beiden Fällen gibt es eine rekursive Schleife empfangen, die in Zustand mindestens ein Argument trägt. Diese Hauptschleife verarbeitet Anforderungen, funktioniert je nach den Anforderungen und, wenn nötig, sendet die Ergebnisse der Anforderer zurück. Die Hauptschleife wird höchstwahrscheinlich eine Reihe von administrativen Anforderungen verarbeiten und welche nicht Teil des Haupt API / Protokolls sein kann.

Der Unterschied besteht darin, dass gen_server weg abstrahiert die Hauptschleife erhalten und ermöglicht es dem Benutzer, die nur schreiben die tatsächliche Benutzercode . Es wird auch viele administrative OTP Funktionen für Sie. Der wesentliche Unterschied besteht darin, dass der Benutzercode in einem anderen Modul ist, das bedeutet, dass Sie sieht die leichter durch Zustand übergeben. Es sei denn, Sie tatsächlich Schleife verwalten Sie Ihren Code in einem großen schreiben erhalten und nicht andere Funktionen aufrufen, die Arbeit gibt es keinen wirklichen Unterschied machen.

Welche Methode ist besser, hängt sehr davon ab, was Sie brauchen. Mit gen_server wird Ihren Code vereinfachen und geben Sie zusätzliche Funktionalität „kostenlos“ aber es kann restriktiver sein. Ihre eigene Roll werden Ihnen mehr Macht geben, aber Sie haben auch mehr Möglichkeiten geben, Dinge zu Screww auf. Es ist wahrscheinlich ein wenig auch schneller. Was brauchen Sie?

beide Modelle verwendet haben, muss ich sagen, dass die bereitgestellte gen_server Verwendung hilft mir leichter strukturiert bleiben. Ich denke, das ist, warum es im OTP-Stapel von Tools enthalten ist. Gen_server ein guter Weg ist, um die sich wiederholende Kessel-Platte aus dem Weg zu bekommen

Wenn Sie Zustand über mehrere Prozesse geteilt haben, sollten Sie wahrscheinlich mit gen_server gehen und wenn der Staat zu einem Prozess nur lokal ist ein stateless Modul tut gut.

Ich nehme Ihre Rechnungen (oder was auch immer sie für stehen) sollten hartnäckig sein, so würden sie ohnehin in einem ETS / Mnesia Tisch landen. Ist dies der Fall, sollten Sie eine stateless Modul erstellen, wo Sie Ihre API setzen für den Zugriff auf die Rechnungstabelle.

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