有人可以解釋Erlang中Pid的結構嗎?有人可以解釋Erlang中Pid的結構嗎?
Pids看起來像這樣:<A.B.C>
,例如, < 0.30.0>,但是我想知道這三個「比特」是什麼意思:A,B和C.
'A'在本地節點上似乎總是爲0,但是這個值會改變當Pid的所有者位於另一個節點時。
是否可以直接使用Pid在遠程節點上發送消息?類似的東西:< 4568.30.0>!消息,而不必明確指定註冊過程的名稱和節點名稱({proc_name,Node}!消息)?
有人可以解釋Erlang中Pid的結構嗎?有人可以解釋Erlang中Pid的結構嗎?
Pids看起來像這樣:<A.B.C>
,例如, < 0.30.0>,但是我想知道這三個「比特」是什麼意思:A,B和C.
'A'在本地節點上似乎總是爲0,但是這個值會改變當Pid的所有者位於另一個節點時。
是否可以直接使用Pid在遠程節點上發送消息?類似的東西:< 4568.30.0>!消息,而不必明確指定註冊過程的名稱和節點名稱({proc_name,Node}!消息)?
印刷進程ID < ABC>由的6:
在內部,進程號在32位模擬器上是28位寬。 B和C的奇怪定義來自R9B和早期版本的Erlang,其中B是15位進程ID,並且C是在達到最大進程ID並且重新使用較低ID時包裝計數器遞增的。
在erlang分佈中,PIDs有點大,因爲它們包含節點原子以及其他信息。 (Distributed PID format)
當內部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()]).
更多信息參見:Internal PID structure, Node creation information, Node creation counter interaction with EPMD
PID是指進程和節點表。因此,只有在您進行呼叫的節點中知道PID時,才能直接向PID發送消息。
如果您已經在運行進程的節點已經調用的節點knows about,這可能會起作用。
如果我正確記住這個格式是<nodeid,serial,creation>
。 0是當前節點,非常類似於計算機始終具有主機名「localhost」來引用自身。這是由舊的記憶,所以它可能不是100%正確的強硬。
但是。例如,您可以使用list_to_pid/1
構建pid。
PidString = "<0.39.0>",
list_to_pid(PidString) ! message.
當然。您只需使用您需要的任何方法來構建您的PidString。大概寫生成它的功能,並使用該代替PidString像這樣:
list_to_pid(make_pid_from_term({proc_name, Node})) ! message
你有沒有看過這個大紅色警告? [list_to_pid/1](http://www.erlang.org/doc/man/erlang.html#list_to_pid-1) 而且你也可以直接發送{proc_name,Node}!消息 或使用模塊全局,如果你想使用全局名稱。 – 2009-01-02 13:44:31
是的..瞭解這些其他方法。這就是我使用的。 這只是不是問題。 :) – 2009-01-17 18:53:46
進程ID < ABC>的組成:
2位的創建標記不顯示在pid中,而是在內部使用,每次節點重新啓動時都會增加。
除了其他人所說,你會發現這個簡單的實驗來了解什麼是內部發生了有用:
1> node().
[email protected]
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>>
所以,你可以本身節點名稱存儲在內部的PID。瞭解更多關於Erlang的更多信息,請點擊this section。
好吧,我的主要問題是固定的。我只是沒有發送好的pid到遠程端... – jideel 2008-11-04 09:44:05