質問
ErlangのPidの構造を誰か説明できますか?
Pidsは次のようになります: <A.B.C>
、例: <!> lt; 0.30.0 <!> gt; 、しかし、これら3つの<!> quot; bits <!> quot;の意味を知りたい:A、B、C。
'A'はローカルノードでは常に0のようですが、この値はPidの所有者が別のノードにいるときに変わります。
Pidのみを使用して、リモートノードでメッセージを直接送信することはできますか?そのようなもの:<!> lt; 4568.30.0 <!> gt; !メッセージ、登録されたプロセスの名前とノード名を明示的に指定する必要なし({proc_name、Node}!Message)?
解決
印刷されたプロセスID <!> lt; A.B.C <!> gt; 6 で構成されています。
- A、ノード番号(0はローカル node、リモートノードの任意の番号)
- B、プロセス番号の最初の15ビット(プロセステーブルへのインデックス) 7
- C、プロセス番号のビット16〜18(Bと同じプロセス番号) 7
内部では、プロセス番号は32ビットエミュレーターでは28ビット幅です。 BとCの奇妙な定義は、R9BおよびErlangの以前のバージョンから来ています。Bは15ビットのプロセスIDであり、Cは最大プロセスIDに達し、より低いIDが再利用されたときにインクリメントされるラップカウンターです。
アーラン分布では、PIDはノードアトムとその他の情報を含むため、少し大きくなっています。 (配布されたPID形式)
内部PIDが1つのノードから他のノードに送信されると、外部PID形式に自動的に変換されるため、1つのノードの<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とのノード作成カウンターの相互作用
他のヒント
これを正しく覚えている場合、形式は<nodeid,serial,creation>
です。
0は、コンピューターが常にホスト名<!> quot; localhost <!> quot;を持っているのと同じように現在のノードです。自分自身を参照する。これは古いメモリによるものであるため、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
プロセスID <!> lt; A.B.C <!> gt;で構成されています:
- A、任意ではないが、dist_entry内のそのノードの内部インデックスであるノードID。 (実際には、ノード名のアトムスロット整数です。)
- B、proctabの内部インデックスを参照するプロセスインデックス(0-<!> gt; MAXPROCS)。
- C、MAXPROCSに達するたびに増加するシリアル。
2ビットの作成タグはpidには表示されませんが、内部的に使用され、ノードが再起動するたびに増加します。
PIDはプロセスとノードテーブルを指します。そのため、呼び出し元のノードでメッセージがわかっている場合にのみ、PIDに直接メッセージを送信できます。
これは、呼び出し元のノードが既にを知っている場合に機能する可能性があります。 about プロセスが実行されているノード。
他の人が言ったこととは別に、この単純な実験は内部で何が起こっているのかを理解するのに役立つかもしれません:
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>>
そのため、ノード名は内部的にpidに保存されます。 Learn You Some Erlangのこのセクションの詳細情報