Может кто-нибудь объяснить структуру Pid в Erlang?
Pids выглядит так: <A.B.C>, например <0.30.0>, но я хотел бы знать, что означают эти три «бита»: A, Bи C.
Aкажется, что он всегда 0находится на локальном узле, но это значение меняется, когда владелец Pid находится на другом узле.
Можно ли напрямую отправить сообщение на удаленный узел, используя только Pid? Примерно так: <4568.30.0>! Message, без явного указания имени регистрируемого процесса и имени узла ( {proc_name, Node}! Message)?
Решение проблемы
Печатные идентификаторы процессов <ABC> состоят из 6:
- A — номер узла (0 — локальный узел, произвольное число — удаленный узел)
- B, первые 15 бит номера процесса (индекс в таблице процессов) 7
- C, биты 16-18 номера процесса (тот же номер процесса, что и B) 7
Внутренний номер процесса имеет ширину 28 бит на 32-битном эмуляторе. Нечетное определение B и C исходит из R9B и более ранних версий Erlang, в которых B был 15-битным идентификатором процесса, а C был счетчиком переноса, увеличивающимся при достижении максимального идентификатора процесса и повторном использовании более низких идентификаторов.
В дистрибутиве erlang идентификаторы PID немного больше, так как они включают в себя атом узла, а также другую информацию. ( распределенный формат PID )
Когда внутренний PID отправляется с одного узла на другой, он автоматически преобразуется в форму внешнего/распределенного PID, поэтому то, что может быть <0.10.0>( inet_db) на одном узле, может оказаться таким, как <2265.10.0>при отправке на другой узел. Вы можете просто отправить на эти PID как обычно.
% get the PID of the user server on OtherNode
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]),
true = is_pid(RemoteUser),
% send message to remote PID
RemoteUser! ignore_this,
% print "Hello from <nodename>\n" on the remote node's console.
io:format(RemoteUser, "Hello from ~p~n", [node()]).
Для получения дополнительной информации см. Внутренняя структура PID,
Информация о создании узла,
Взаимодействие счетчика создания узла с EPMD
Комментариев нет:
Отправить комментарий