スポーン直後に何かを実行し、終了したら結果を親に送り返すことになっているerlangのプロセスがあります。それを生成したプロセスのPIDをどのように把握しますか?
4 に答える
エントリ関数の引数の1つとして、self()を子に渡す必要があります。
spawn_link(?MODULE, child, [self()]).
最良の方法は、子プロセスを開始するために呼び出される関数に引数として渡すことです。ファンをスポーンしている場合、これは一般的に良いことですが、次のことには注意してください。
spawn_link(fun () -> child(self()) end)
あなたが意図したようにはなりません。(ヒント: self() が呼び出されるタイミング)
一般に、プロセスをグローバルに認識させたい場合を除き、プロセスの登録、つまりプロセスにグローバル名を付けることは避けるべきです。fun をスポーンするということは、スポーンされた関数をエクスポートする必要がないことを意味します。通常、他のモジュールから呼び出されることを意図していない関数をエクスポートすることは避ける必要があるためです。
@Eridiusの答えは、それを行うための好ましい方法です。名前を登録するプロセスを要求すると、多くのプロセスがある場合に一意の名前を考え出す手間は言うまでもなく、プロセスの可視性が高まるなど、意図しない副作用が生じる可能性があります。
BIFレジスタを使用して、スポーン/親プロセスに名前(アトム)を付けてから、他のプロセスから登録された名前を参照することができます。
FUNC()->
%%何かをする
%%次に、親の親にメッセージを送信します
!メッセージ。..。
register(parent、self())、
spawn(MODULE、FUNC、[ARGS])。
Erlang入門§3.3およびErlangリファレンスマニュアル§10.3を参照してください。