【问题标题】:Properly exit all processes Erlang正确退出所有进程 Erlang
【发布时间】:2014-04-28 05:04:48
【问题描述】:

我有一个包含很多进程的 Erlang“后端”。现在我正在准备一个测试延迟的基准文件,我想在一个循环中运行这个测试,这会增加某些负载参数。

我基本上有一个server:init() 函数来启动主服务器管理器进程,然后我通过该管理器在服务器上注册N 客户端。管理器将为新注册的客户端指定一个任意数据参与者进程。

每个数据参与者都有多个客户端。我添加了一个小图表来向您展示我的意思。

       +------------+
       |Manager     |
       +------------++-----------+
          +       +              |
          |       |              |
          v       v              v
       +-----+  +-----+       +-----+
       |     |  |     |       |     |
       | Da 1|  | Da 2|       |Da N |
       +-----+  +-----+ . . . +-----+
           +         +
           |         |
           |         |
           |         |
 +----+    | +----+  |
 |c1.1|<---| |c2.1|<-|
 |    |    | |    |  |
 +----+    | +----+  |
           |         |
 +----+    | +----+  |
 |c1.2|<---+ |c2.2|<-+
 |    |      |    |
 +----+      +----+
 .           .
 .           .
 .           .

我现在要做的是在负载测试完成后运行服务器并终止所有进程。似乎我无法在同一个erl repl 中运行我的 loadtest 两次,因为某些进程仍在运行。 (例如 register(name, ) 失败)。

我读到了关于杀死进程 here 的文章,但我觉得奇怪的是,在像 Erlang 这样的语言中,没有更大胆的方法可以做到这一点。

我可以从该文件中弥补的是,我的manager 必须向所有数据参与者发送信号以杀死自己,但在此之前,还要杀死他们所有的客户端进程吗?即,传播消息并开始从树的底部向上杀进程到我的经理。

好像很啰嗦,不知道有没有别的办法。

到目前为止,我有以下内容:

当我的负载测试完成后,启动管理器进程的进程(shell)会这样做:

exit() ->
    unregister(data_actor_manager),
    unregister(shell),
    exit(data_actor_manager, normal).

但这会导致严重的错误:

 {"init terminating in do_boot",{badarg,[{erlang,unregister,[data_actor_manager],[]},{server_single_actor,exit,0,[{file,"c:/Users/CHRIST~1/DOCUME~1/BITBUC~1/ERLANG~2/src/server_single_actor.erl"},{line,48}]},{load,start,0,[{file,"c:/Users/CHRIST~1/
CUME~1/BITBUC~1/ERLANG~2/src/load.erl"},{line,36}]},{init,start_it,1,[{file,"init.erl"},{line,1054}]},{init,start_em,1,[{file,"init.erl"},{line,1034}]}]}}

该错误意味着data_actor_manager 不是有效的名称或 Pid,但它是..

所以我尝试了以下方法。考虑到我可能不必注销与经理 Pid 关联的原子,我尝试了这个:

exit() ->
    exit(whereis(data_actor_manager), normal).

但是,我再次收到 badarg 错误消息。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    Erlang/OTP 主管行为似乎非常适合这个问题:http://www.erlang.org/doc/design_principles/sup_princ.htmlhttp://www.erlang.org/doc/man/supervisor.html

    基本上,您可以设置一个监督树,该树将从您的主服务器级联并处理您的客户端的终止和重新启动。

    【讨论】:

    • 或者,只需 link 您的所有进程。
    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 2013-06-25
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多