【发布时间】: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