2008-08-07 9 views
12

Ich habe einen Prozess in Erlang, der etwas unmittelbar nach dem Spawn tun soll, dann senden Sie das Ergebnis zurück zum Elternteil, wenn es fertig ist. Wie finde ich die PID des Prozesses heraus, der sie hervorgebracht hat?Wie bestimmen Sie die PID des Elternteils eines Prozesses

+0

Für OTP und andere Prozesse, die 'proc_lib' verwenden, siehe [Wie finde ich den Supervisor eines OTP-Prozesses?] (Http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of -an-otp-process) –

Antwort

14

Sie sollten self() an das Kind als eines der Argumente für die Eingabefunktion übergeben.

spawn_link(?MODULE, child, [self()]). 
0

Sie können mit der BIF registrieren den Laich/Eltern-Prozess einen Namen zu geben (ein Atom), dann zurück an den registrierten Namen von anderen Prozessen beziehen.

FUNK() ->

%%
etwas tun %% Dann
Mutter Nachricht an Eltern schicken! BOTSCHAFT.

...

Register (parent, self()),
Spawn (MODULE, FUNC, [] args).

Siehe Getting Started With Erlang §3.3 und The Erlang Reference Manual §10.3.

+0

Während Sie es tun könnten, indem Sie einen Namen registrieren, ist es überhaupt keine gute Idee. Dieser Beitrag wäre besser, wenn Sie sich aktiv dafür entmutigen und die Probleme erklären würden. – Christian

+1

Zurück in der privaten Beta (diese Frage stammt etwa eine Woche nach Beginn der privaten Beta) war der Diskussionsaspekt der Website nicht besonders gut strukturiert. Ich wollte nicht wirklich eine Meinung äußern, sondern lediglich einen alternativen Ansatz angeben. Ich denke, die Vor- und Nachteile wurden in den anderen Antworten/Posts angemessen berücksichtigt. –

4

@Eridius 'Antwort ist der bevorzugte Weg, dies zu tun. Das Erzwingen eines Prozesses zur Registrierung eines Namens kann unbeabsichtigte Nebenwirkungen haben, wie zum Beispiel die Sichtbarkeit des Prozesses erhöhen, ganz zu schweigen von der Schwierigkeit, bei vielen Prozessen eindeutige Namen zu erstellen.

3

Der beste Weg ist definitiv, es als Argument an die aufgerufene Funktion übergeben, um den Kindprozess zu starten. Wenn Sie Spaße laichen, die in der Regel eine gute Sache zu tun ist, seien Sie vorsichtig zu tun:

spawn_link(fun() -> child(self()) end) 

, die, wie Sie beabsichtigten geht nicht. (Hinweis: when ist self() angerufen)

Im Allgemeinen sollten Sie vermeiden, einen Prozess zu registrieren, d. H. Einen globalen Namen zu vergeben, es sei denn, Sie möchten wirklich, dass er global bekannt ist. Das Erzeugen eines Spaßes bedeutet, dass Sie die erstellte Funktion nicht exportieren müssen, da Sie im Allgemeinen den Export von Funktionen vermeiden sollten, die nicht von anderen Modulen aufgerufen werden sollen.

Verwandte Themen