4

特定のプロセス(ジェネレーターと呼びましょう)にErlangで新しいプロセスを作成するように指示するにはどうすればよいですか?

また、ジェネレーターが作成したすべてのプロセスを追跡するにはどうすればよいですか?

4

2 に答える 2

4

わかった。さて、学習の目的で、非常に基本的な例を見てみましょう。他の人はOTP Supervisors, Process dictionariesなどについて話しますが、私はそれを学習目的のために簡単に保ちたいです。この例では、ジェネレーターは、作成したプロセスの数を知ることができ、プロセスはPidsいつ死ぬかを知ることができます。

-モジュール(ジェネレーター)。
-compile(export_all)。
-define(ERROR(X)、error_logger:error_report(X))。
start()-> register(generator、spawn(fun()-> generator()end))、 わかった。
ジェネレータ()-> ProcessBuffer = []、 process_flag(trap_exit、true)、 loop(ProcessBuffer)。
create(Module、Function、Args)-> 発生器 !{create_new_proc、{Module、Function、Args}}、 わかった。
send_to_kids(メッセージ)-> 発生器 !{tell_kids、Message}、 わかった。
loop(Buffer)-> 受け取る {create_new_proc、{M、F、A}}-> Pid = spawn(M、F、A)、 link(Pid)、 loop([Pid | Buffer]); {tell_kids、Message}-> [ 子供 !{ブロードキャスト、メッセージ} || キッド<-バッファ]、 ループバッファ); {'EXIT'、SomePid、Reason}-> ?ERROR(["子がクラッシュしました"、{pid、SomePid}、{reason、Reason}])、 loop(lists:delete(SomePid、Buffer)); _-> loop(Buffer) 終わり。
child_loop()-> 受け取る {ブロードキャスト、メッセージ}-> io:format( "\ n \ tChild:〜p got:〜p〜n"、[self()、Message])、 child_loop(); _-> child_loop() 終わり。
シェルでのテスト
E:\ Applications> erl
Eshell V5.9(^ Gで中止)
1> c(ジェネレーター)。
{ok、generator}
2> generator:start()。
わかった
3> generator:create(generator、child_loop、[])。
わかった
4> [generator:create(generator、child_loop、[])|| _ <-lists:seq(1,5)]、ok。
わかった
5> generator:send_to_kids( "Erlangは良いです!")。
        子:<0.45.0>取得:「Erlangは良いです!」
        子:<0.44.0>取得:「Erlangは良いです!」
        子:<0.43.0>取得:「Erlangは良いです!」
        子:<0.42.0>取得:「Erlangは良いです!」
        子:<0.41.0>取得:「Erlangは良いです!」
        子:<0.39.0>取得:「Erlangは良いです!」
わかった
6> generator:send_to_kids( "1 + 1 = 2")。
        子:<0.45.0>取得: "1 + 1 = 2"
        子:<0.44.0>取得: "1 + 1 = 2"
        子:<0.43.0>取得: "1 + 1 = 2"
        子:<0.42.0>取得: "1 + 1 = 2"
        子:<0.41.0>取得: "1 + 1 = 2"
        子:<0.39.0>取得: "1 + 1 = 2"
わかった
7>
開始として登録されたプロセスgeneratorは、任意の数の子プロセスを開始するように指示される場合があります。子プロセスは、に{M, F, A}送信された組み合わせから一般的に作成されgeneratorます。ジェネレータループは、作成されたプロセスの実績を保持します。次に、すべてのプロセスにメッセージをブロードキャストするように指示できます。

ただし、実際/本番環境では、これを行わない場合があります。これは、リストが大きくなるにつれてgeneratorループが大量のメモリを消費する可能性があるためです。、なども使用できますが、少し高度に見えるため、例では使用していません。詳細については、この質問とその回答をご覧ください。BufferPidsETS TablesMnesia

于 2012-12-05T07:51:00.803 に答える
1

以下を確認できます:http : //www.erlang.org/doc/design_principles/des_princ.htmlosErlangの用語では「ジェネレーター」は「スーパーバイザー」でした

于 2012-12-05T05:58:37.653 に答える