2016-05-12 13 views
0

Ich habe eine Supervisor-Struktur, die einen Supervisor pro (TCP) Verbindung benötigt. Nun scheint es, dass jeder Supervisor seinen eigenen eindeutigen Namen benötigt, der wiederum ein Atom sein muss (zumindest das, was ich aus den Fehlermeldungen erhalte).Eindeutige Supervisor/Server-Namen

Ein Workaround wäre, jedes Mal ein neues Atom zu erzeugen, ähnlich wie a suggestion from the erlang-questions list.

Jetzt habe ich gelernt, dass Atome nie aufgeräumt werden, also besteht die Möglichkeit, durch zu viele Verbindungen DoSed zu werden, den Atomraum erschöpfend. Wie wird das richtig gemacht?

Antwort

4

Hier sind zwei Arten von Namen beteiligt, registrierte Namen für Prozesse und Bezeichner für Supervisor-Kinder.

Für jeden Supervisor-Prozess ist kein registrierter Name erforderlich. Es gibt zwei Funktionen zum Starten eines Supervisor-Prozesses, supervisor:start_link/2 and supervisor:start_link/3. start_link/3 startet den Supervisor und registriert ihn unter dem angegebenen Namen, während start_link/2 den Supervisor startet, ohne einen Namen dafür zu registrieren. (Wenn der Prozess keinen registrierten Namen hat, kann er nur über seine PID referenziert werden.)

Wie für Bezeichner für Supervisor-Kinder, wenn Sie einen Supervisor haben, der über unbegrenzte Anzahl untergeordneter Prozesse verfügt (Unabhängig davon, ob diese untergeordneten Prozesse Arbeiter oder Supervisor sind), verwenden Sie normalerweise den speziellen Neustarttyp simple_one_for_one. Das bedeutet, dass statt einer Liste statischer Kindspezifikationen (die entweder von der Rückruffunktion init zurückgegeben oder mit der supervisor:start_child-Funktion hinzugefügt wurden) der Supervisor eine untergeordnete "Vorlage" -Kindspezifikation hat und die supervisor:start_child-Funktion "anonyme" untergeordnete Kinder erstellt diese Vorlage.