Как вы определяете PID родителя процесса - PullRequest
14 голосов
/ 07 августа 2008

У меня есть процесс в эрланге, который должен сделать что-то сразу после появления, затем отправить результат родителю, когда он закончится. Как мне определить PID процесса, который его породил?

Ответы [ 4 ]

14 голосов
/ 07 августа 2008

Вы должны передать self () дочернему элементу в качестве одного из аргументов функции ввода.

spawn_link(?MODULE, child, [self()]).
4 голосов
/ 16 сентября 2008

@ Ответ Эридиуса - предпочтительный способ сделать это. Требование процесса для регистрации имени может иметь непредвиденные побочные эффекты, такие как увеличение наглядности процесса, не говоря уже о том, что приходится сталкиваться с уникальными именами, когда у вас много процессов.

3 голосов
/ 11 августа 2009

Лучший способ - это передать его в качестве аргумента функции, вызываемой для запуска дочернего процесса. Если вы порождаете веселье, что обычно является хорошим делом, будьте осторожны:

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

, который НЕ будет делать, как вы хотели. (Подсказка: когда вызывается self ())

Как правило, вам следует избегать регистрации процесса, т. Е. Давать ему глобальное имя, если вы действительно не хотите, чтобы он был известен всему миру. Создание веселья означает, что вам не нужно экспортировать порожденную функцию, так как вы должны избегать экспорта функций, которые не должны вызываться из других модулей.

0 голосов
/ 07 августа 2008

Вы можете использовать регистр BIF, чтобы дать процессу / родительскому процессу имя (атом), а затем сослаться на зарегистрированное имя из других процессов.

FUNC () ->

%% Сделай что-нибудь
%% Затем отправьте сообщение родителю
родитель! MESSAGE.

...

регистр (родитель, self ()),
spawn (MODULE, FUNC, [ARGS]).

См. Начало работы с Erlang §3.3 и Справочное руководство Erlang §10.3 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...