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)?

Foi útil?

Solução

processo Impresso ids são compostos de 6 :

  • 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 é composto por:

    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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top