gpt4 book ai didi

erlang - 如何告诉一个进程创建另一个进程并跟踪它

转载 作者:行者123 更新时间:2023-12-05 01:15:44 26 4
gpt4 key购买 nike

我如何告诉一个特定的进程(我们称之为生成器)在 Erlang 中创建一个新进程?

另外,如何跟踪生成器创建的所有进程?

最佳答案

好的。现在,为了学习的目的,让我们做一个非常基本的例子。别人会说OTP Supervisors, Process dictionaries ETC。但我想为了学习目的而保持轻松。以这个例子,生成器可以知道它创建了多少个进程,它们的Pids ,知道他们什么时候死等等。 -模块(发电机)。
-编译(export_all)。
-定义(错误(X),错误记录器:错误报告(X))。
开始()->
寄存器(发电机,产卵(乐趣()->发电机()结束)),
行。
生成器()->
进程缓冲区 = [],
process_flag(trap_exit,true),
循环(进程缓冲区)。
创建(模块,功能,参数)->
发电机 ! {create_new_proc,{Module,Function,Args}},
行。
send_to_kids(消息)->
发电机 ! {tell_kids,消息},
行。
循环(缓冲区)->
收到
{create_new_proc,{M,F,A}} ->
Pid = spawn(M,F,A),
链接(PID),
循环([Pid|缓冲区]);
{tell_kids,消息} ->
[ child ! {广播,留言} || child <- 缓冲区],
循环(缓冲区);
{'EXIT',SomePid,Reason} ->
?ERROR([" child 崩溃了",{pid,SomePid},{reason,Reason}]),
循环(列表:删除(SomePid,缓冲区));
_ -> 循环(缓冲区)
结尾。
child_loop()->
收到
{广播,消息} ->
io:format("\n\tChild: ~p got: ~p~n",[self(),Message]),
child_loop();
_ -> child_loop()
结尾。

在 shell E:\Applications>erl 中测试
Eshell V5.9(使用 ^G 中止)
1> c(生成器)。
{好的,发电机}
2> 发生器:开始()。

3> 生成器:创建(生成器,child_loop,[])。

4> [生成器:创建(生成器,child_loop,[])|| _ <- 列表:seq(1,5)],好的。

5> generator:send_to_kids("Erlang 很好!").
child :<0.45.0> 得到:“二郎好!”
child :<0.44.0> 得到:“二郎好!”
child :<0.43.0> 得到:“二郎好!”
child :<0.42.0> 得到:“二郎好!”
child :<0.41.0> 得到:“二郎好!”
child :<0.39.0> 得到:“二郎好!”

6> 发生器:send_to_kids("1+1 = 2")。
child :<0.45.0> 得到:“1+1 = 2”
child :<0.44.0> 得到:“1+1 = 2”
child :<0.43.0> 得到:“1+1 = 2”
child :<0.42.0> 得到:“1+1 = 2”
child :<0.41.0> 得到:“1+1 = 2”
child :<0.39.0> 得到:“1+1 = 2”

7>

一个注册为 generator 的进程被启动并且可能被告知启动任意数量的子进程。子进程一般是从 {M, F, A} 创建的。组合发送至generator .生成器循环保留创建的进程的跟踪记录。然后可以告诉它向所有进程广播消息。
但是,在实践/生产中,您可能不会这样做,因为 generator循环可能会消耗大量内存作为列表 Buffer自从那是我们保留所有 Pids 以来的增长我们的流程。您也可以使用ETS Tables , 或 Mnesia等,但我没有在示例中使用它们,因为它们看起来更高级一些。看看这个question及其answer了解更多。

关于erlang - 如何告诉一个进程创建另一个进程并跟踪它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13712900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com