Как определить PID родительского процесса

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

Ответов (4)

Решение

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

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

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

FUNC () ->

%% Сделайте что-нибудь
%% Затем отправьте сообщение
родителю! СООБЩЕНИЕ.

...

регистр (родитель, сам ()),
порождение (МОДУЛЬ, ФУНКЦИЯ, [ARGS]).

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

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

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

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

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

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