【问题标题】:gen_server stop badmatch on sub process stopped子进程上的 gen_server stop badmatch 已停止
【发布时间】:2017-12-20 18:19:42
【问题描述】:

我有一个table 进程,它为board 创建一个pid,作为go() 状态的一部分。

我正在测试终止表也会终止板。但是董事会并没有像预期的那样停止。

我的测试:

kills_board_test() ->
  {ok, Table} = table:go(),
  {BoardPid, _ ,_ } = s:s(Table, info),
  gen_server:stop(Table),
  undefined = process_info(BoardPid).

table.erl我实现:

handle_call(stop, _From, State = {Board, _, _}) ->
    gen_server:stop(Board),
    {stop, normal, shutdown_ok, State};

我的结果是:

> 6>table_test:test(). table_test: kills_board_test (module
> 'table_test')...*failed* in function table_test:kills_board_test/0
> (table_test.erl, line 8)
> **error:{badmatch,[{current_function,{gen_server,loop,6}},
>            {initial_call,{proc_lib,init_p,5}},
>            {status,waiting},
>            {message_queue_len,0},
>            {messages,[]},
>            {links,[]},
>            {dictionary,[{'$initial_call',{board,init,1}},
>                         {'$ancestors',[<0.351.0>,<0.349.0>]}]},
>            {trap_exit,false},
>            {error_handler,error_handler},
>            {priority,normal},
>            {group_leader,<0.350.0>},
>            {total_heap_size,233},
>            {heap_size,233},
>            {stack_size,9},
>            {reductions,152},
>            {garbage_collection,...},
>            {...}]}   output:<<"Table Terminating.{<0.352.0>,
>                    #{current_player => x,result => playing},
>                    #{o => {<0.355.0>,<0.356.0>},x => {<0.353.0>,<0.354.0>}}} ">>
> 
> =======================================================   Failed: 1.  Skipped: 0.  Passed: 0. error 

编辑:

我看到文字“终止”,但我知道停止会等待终止完成后再返回。

【问题讨论】:

  • 您的意思是使用gen_server:call(Table, stop) 而不是gen_server:stop(Table)
  • doh,是的,谢谢! (再次强调,你是英雄)

标签: erlang gen-server eunit


【解决方案1】:

您的自定义停止行为在 handle_call(stop, ...) 中,但您调用的 gen_server:stop/1 不会调用该代码。你可能打算改用gen_server:call(Table, stop)

也就是说,您可能希望将此停止行为移至 Module:terminate/2gen_server:stop 自动调用(除非您有理由在 handle_call 中实现此行为) :

terminate(_Reason, _State = {Board, _, _}) ->
  gen_server:stop(Board)

现在,gen_server:stop(Table) 将调用此回调并自动停止 Board

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2016-05-18
    • 2013-12-12
    • 2012-02-23
    • 2019-03-09
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多