Ответ 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
. Теоретически мы могли бы, но мониторы реализованы таким образом, что можно установить несколько мониторов между двумя одинаковыми процессами. Поэтому при демоннировании мы должны удалить только одно из таких соединений. Это делается таким образом, чтобы сделать мониторинг более прозрачным. Если у вас есть библиотека функций, которые создают и удаляют один монитор, вам не хотелось бы вмешиваться в другие библиотеки, функции и мониторы, которые они могли бы использовать.