Kann jemand die Struktur einer Pid in Erlang erklären?
Pids sieht so aus: <A.B.C>
, zB <0.30.0>
, aber ich würde gerne wissen, was diese drei "Bits" bedeuten: A
, B
und C
.
A
scheint sich immer 0
auf einem lokalen Knoten zu befinden, aber dieser Wert ändert sich, wenn sich der Besitzer der Pid auf einem anderen Knoten befindet.
Ist es möglich, nur mit der Pid eine Nachricht direkt an einen Remote-Knoten zu senden? Etwa so: <4568.30.0>! Message
, ohne den Namen des registrierten Prozesses und den Knotennamen ( {proc_name, Node}! Message
) explizit angeben zu müssen?
Lösung des Problems
Gedruckte Prozess-IDs < ABC > bestehen aus 6:
- A, die Knotennummer (0 ist der lokale Knoten, eine beliebige Nummer für einen entfernten Knoten)
- B, die ersten 15 Bits der Prozessnummer (ein Index in der Prozesstabelle) 7
- C, Bits 16-18 der Prozessnummer (die gleiche Prozessnummer wie B) 7
Intern ist die Prozessnummer im 32-Bit-Emulator 28 Bit breit. Die ungerade Definition von B und C stammt von R9B und früheren Versionen von Erlang, in denen B eine 15-Bit-Prozess-ID und C ein Wrap-Zähler war, der inkrementiert wurde, als die maximale Prozess-ID erreicht wurde und niedrigere IDs wiederverwendet wurden.
In der Erlang-Verteilung sind PIDs etwas größer, da sie das Knotenatom sowie die anderen Informationen enthalten. ( Verteiltes PID-Format )
Wenn eine interne PID von einem Knoten zum anderen gesendet wird, wird sie automatisch in die externe/verteilte PID-Form konvertiert, sodass das, was auf einem Knoten <0.10.0>
( inet_db
) sein könnte, möglicherweise so endet, als würde <2265.10.0>
es an einen anderen Knoten gesendet. Sie können ganz normal an diese PIDs senden.
% 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()]).
Weitere Informationen finden Sie unter: Interne PID-Struktur,
Knotenerstellungsinformationen,
Interaktion des Knotenerstellungszählers mit EPMD
Keine Kommentare:
Kommentar veröffentlichen