gpt4 book ai didi

erlang - 监控 gen_server

转载 作者:行者123 更新时间:2023-12-02 09:58:35 27 4
gpt4 key购买 nike

我一直在尝试使用 erlang:monitor/2 来监视 gen_server。不幸的是,每次我尝试这个时,Erlang shell 都会进入无限循环。

这是我为测试这一点而编写的测试程序。

-module(testmon).

-compile(export_all).

start() ->
{ok,Proc} = gen_server:start(calc,[],[]),
erlang:monitor(process,Proc),
receive
{'DOWN', Ref, process, Pid, normal} ->
io:format("~p said that ~p died by natural causes~n",[Ref,Pid]);
{'DOWN', Ref, process, Pid, Reason} ->
io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason])
end.

当我使用上面的代码来监视像这样的spawn(fun() -> ok end)(通过将第6行和第7行更改为erlang:monitor(spawn(fun() -> ok end))上面的内容时代码按预期工作。

有人可以告诉我我做错了什么吗?是否只能通过主管来监视 gen_server 进程?

谢谢

最佳答案

这不是一个无限循环(Erlang 中根本没有循环),你的 shell 只是阻塞在接收中,直到 gen_server 由于某种原因死亡。如果您希望 shell 立即返回,只需生成一个额外的进程来进行监视。它不一定是 gen_supervisor,您在单独进程中的代码应该按预期运行。

这可能看起来像这样:

-module(testmon).

-compile(export_all).

start() ->
{ok,Proc} = gen_server:start(calc,[],[]),
spawn(?MODULE, monitor, [Proc]).

monitor(Proc) ->
erlang:monitor(process,Proc),
receive
{'DOWN', Ref, process, Pid, normal} ->
io:format("~p said that ~p died by natural causes~n",[Ref,Pid]);
{'DOWN', Ref, process, Pid, Reason} ->
io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason])
end.

关于erlang - 监控 gen_server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9772357/

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