Ссылка на pid?

Я не совсем уверен в различиях между PID и ссылкой и когда использовать.

Если я должен был создать новый процесс с помощью spawn/1 pid. Я могу убить его с помощью ПИД-регулятора нет? Зачем мне нужна ссылка?

Аналогично, я вижу, что monitor/1 получает сообщение с номером ref и pid.

Спасибо!

Ответ 1

Pid - это идентификатор процесса. Вы можете получить его при создании нового процесса с помощью spawn, или вы можете получить Pid от себя с помощью self(). Это позволяет вам взаимодействовать с данным процессом. Особенно отправляйте ему сообщения Pid ! Message. И некоторые другие вещи, например, убивать его явно (не следует) или получать информацию о процессе с помощью erlang:process_info.

И вы можете создавать отношения между процессом с erlang:link(Pid) и erlang:monitor(process, Pid) (между процессом Pid и выполнением этой функции процессом). Короче говоря, он дает вам "уведомления", когда другой процесс умирает.

Ссылка - это просто почти уникальное значение (другого типа). Можно сказать, что он дает вам некоторые ссылки здесь и сейчас, которые вы могли бы узнать позже. Например, если мы отправляем сообщение другому процессу и ожидаем ответа, мы хотели бы удостовериться, что сообщение, которое мы получим, связано с нашим запросом, а не только с каким-либо сообщением от кого-то другого. Самый простой способ сделать это - пометить сообщение уникальным значением и подождать ответа с точно таким же тегом.

  Tag = make_ref(),
  Pid ! {Tag, Message},
  receive 
     {Tag, Response} ->
         ....

В этом коде с использованием сопоставления шаблонов мы убеждаемся, что (мы ждем в получении до тех пор, пока Response не будет точно для отправленного Message. Независимо от других сообщений от других процессов. Это наиболее распространенное использование ссылки, с которой вы можете столкнуться.

А теперь вернемся к monitor. При вызове Ref = monitor(process, Pid) мы делаем это специальное соединение с процессом Pid. Возвращаемый Ref - это лишь некоторые уникальные ссылки, которые мы могли бы использовать для demonitor этого процесса. Это все.

Можно просто спросить, можем ли мы создать монитор с Pid, зачем нам нужно Ref для демонстрации? Не могли бы мы снова использовать Pid. Теоретически мы могли бы, но мониторы реализованы таким образом, что можно установить несколько мониторов между двумя одинаковыми процессами. Поэтому при демоннировании мы должны удалить только одно из таких соединений. Это делается таким образом, чтобы сделать мониторинг более прозрачным. Если у вас есть библиотека функций, которые создают и удаляют один монитор, вам не хотелось бы вмешиваться в другие библиотеки, функции и мониторы, которые они могли бы использовать.

Ответ 2

В соответствии с эта страница:

Ссылки - это объекты erlang с двумя свойствами:

They can be created by a program (using make_ref/0), and,
They can be compared for equality.

Вы должны использовать его, когда вам нужно привязать уникальный идентификатор к некоторому "объекту". Каждый раз, когда вы можете создать новый, используя erlang:make_ref/0. Документация говорит:

make_ref() → reference()

Возвращает почти уникальную ссылку.

Возвращенная ссылка будет повторяться после примерно 2 ^ 82 вызовов; поэтому он достаточно уникален для практических целей.

Когда вы вызываете функцию erlang:monitor/2, она возвращает вашу ссылку, чтобы дать вам возможность отменить мониторинг (функция erlang:demonitor/1). Эта ссылка только идентифицирует определенный вызов erlang:monitor/1. Если вам нужно работать с процессом (например, убить его), вам все равно придется использовать pid процесса.

Аналогично, я вижу, что монитор /1 получает сообщение с номером ref и pid.

Да, монитор отправляет сообщения типа {'DOWN', Ref, process, Pid, ​​Reason}. Что использовать (pid или ref) зависит только от вашей логики приложения, но (IMO) в большинстве обычных случаев не имеет значения, что использовать.