Alguém pode explicar a estrutura de um Pid em Erlang?
Pergunta
Alguém pode explicar a estrutura de um Pid em Erlang?
Pids parecido com este: <A.B.C>
, por exemplo, <0.30.0>, mas eu gostaria de saber qual é o significado desses três "bits":. A, B e C
'A' parece ser sempre 0 em um nó local, mas este valor muda quando o dono do Pid está localizado em outro nó.
É possível enviar diretamente uma mensagem em um nó remoto usando apenas o Pid? Algo assim: <4568.30.0>! Mensagem, sem ter que especificar explicitamente o nome do processo registrada eo nome do nó ({proc_name, Nó}! Mensagem)?
Solução
processo Impresso ids
- A, o número do nó (0 é o local de nó, um número arbitrário para um nó remoto)
- B, os primeiros 15 bits do número de processo (um índice para a tabela de processos) 7
- C, bits 16-18 do número de processo (o mesmo número de processo como B) 7
Internamente, o número do processo é de 28 bits de largura no emulador de 32 bits. A definição ímpar de B e C vem de R9B e versões anteriores do Erlang em que B era um ID processo 15bit e C era um contador envoltório incrementado quando o ID do processo max foi alcançado e IDs menores foram reutilizados.
Nos PIDs distribuição Erlang são um pouco maiores uma vez que incluem o átomo de nó, bem como a outras informações. ( Distribuído PID formato )
Quando um PID interna é enviada de um nó para o outro, ele é automaticamente convertido para a forma PID externo / distribuída, de modo que poderia ser <0.10.0>
(inet_db
) em um nó pode acabar como <2265.10.0>
quando enviado para outro nó. Você pode apenas enviar para esses PIDs como normal.
% 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()]).
Para mais informações consulte: Interno PID estrutura , Nó informações de criação , Nó criação contador de interação com EPMD
Outras dicas
Se eu me lembro isso corretamente o formato é <nodeid,serial,creation>
.
0 é o nó atual muito parecido com um computador tem sempre o nome do host "localhost" para se referir a si mesmo. Este é pela memória de idade, então ele pode não ser 100% correto difícil.
Mas sim. Você poderia construir o pid com list_to_pid/1
por exemplo.
PidString = "<0.39.0>",
list_to_pid(PidString) ! message.
Claro. Você acabou de usar qualquer método que você precisa usar para construir o seu PidString. Provavelmente escrever uma função que gera-lo e utilizá-lo de PidString como tal:
list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message
ID do processo
-
id
- A, nó que não é arbitrária, mas o índice interno para esse nó em dist_entry. (Na verdade, é o inteiro slot de átomo para o nome do nó.)
- B, índice de processo que se refere ao índice interno no proctab,. (0 -> MAXPROCS)
- C, série que aumenta cada vez MAXPROCS foi atingido.
A tag criação de 2 bits não é exibido na pid mas é usado internamente e aumenta cada vez que o nó for reiniciado.
O PID refere-se a um processo e uma mesa nó. Então você só pode enviar uma mensagem diretamente para um PID se ele é conhecido no nó do qual você faz a chamada.
É possível que isso vai funcionar se o nó que você faz a chamada já sabe sobre o nó no qual o processo está sendo executado.
Além do que já foi dito, você pode encontrar este experimento simples útil para entender o que está acontecendo internamente:
1> node().
nonode@nohost
2> term_to_binary(node()).
<<131,100,0,13,110,111,110,111,100,101,64,110,111,104,111,
115,116>>
3> self().
<0.32.0>
4> term_to_binary(self()).
<<131,103,100,0,13,110,111,110,111,100,101,64,110,111,104,
111,115,116,0,0,0,32,0,0,0,0,0>>
Assim, você pode se que o nome do nó é armazenado internamente no pid. Mais informações em nesta seção de Aprender lhe algum Erlang.