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

StackOverflow https://stackoverflow.com/questions/4287

  •  08-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

который БУДЕТ работать НЕ так, как вы предполагали.(Подсказка:когда вызывается функция self())

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

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

ФУНКЦИЯ () ->

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

...

зарегистрировать (родительский элемент, self()),
порождать (МОДУЛЬ, ФУНКЦИЯ, [АРГУМЕНТЫ]).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top