我在试图在另一个节点上运行gen_server时遇到了一些问题。
start(FileName) ->
start_link(node(), FileName).
start_link(ThisNode, FileName) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [ThisNode, FileName], []).
init([ThisNode, FileName]) ->
process_flag(trap_exit, true),
{ok, Terms} = file:consult(FileName),
{A1, B1, C1} = lists:nth(1,Terms),
place_objects(A1, B1, C1).
现在,我想启动多个节点,这些节点将运行相同的gen_server,并以某种方式相互通信,然后使用另一个节点来协调这些通信。(所有这些节点都在我的本地终端上启动)。
所以我用erl -sname bar
在一个终端上启动一个新节点,我打算在这个节点上运行gen_server,并在这个节点上编译gen_server模块。然后我启动另一个名为'sup'的节点,我打算用它作为所有其他节点的协调器。如果我在bar上运行命令my_gen_server:start("config_bar.txt").
,它会成功返回,但当我在sup上运行命令rpc:call('bar@My-MacBook-Pro', my_gen_server, start, ["config_bar.txt"]).
时,它成功地从init方法返回(我通过在日志中检查了这一点),但紧接着,我得到了以下错误:
{ok,<9098.166.0>}
(sup@My-MacBook-Pro)2> =ERROR REPORT==== 21-Feb-2022::11:12:30.443051 ===
** Generic server my_gen_server terminating
** Last message in was {'EXIT',<9098.165.0>,
{#Ref<0.3564861827.2990800899.137513>,return,
{ok,<9098.166.0>}}}
** When Server state == {10,10,#Ref<9098.1313723616.3973185546.82660>,
'bar@My-MacBook-Pro'}
** Reason for termination ==
** {#Ref<0.3564861827.2990800899.137513>,return,{ok,<9098.166.0>}}
=CRASH REPORT==== 21-Feb-2022::11:12:30.443074 ===
crasher:
initial call: my_gen_server:init/1
pid: <9098.166.0>
registered_name: my_gen_server
exception exit: {#Ref<0.3564861827.2990800899.137513>,return,
{ok,<9098.166.0>}}
in function gen_server:decode_msg/9 (gen_server.erl, line 481)
ancestors: [<9098.165.0>]
message_queue_len: 0
messages: []
links: []
dictionary: []
trap_exit: true
status: running
heap_size: 1598
stack_size: 29
reductions: 3483
neighbours:
我似乎不知道是什么原因导致的错误,如果有什么我需要添加到我的gen_server代码来修复它。真的很感激一些帮助这一点!
1条答案
按热度按时间gorkyyrv1#
远程节点中的
gen_server
链接到为rpc
调用创建的临时进程,当这个临时进程退出时的项与normal
(rpc调用的实际结果)不同,退出信号传播到gen_server
,将其杀死。您可以使用
gen_server:start
而不是gen_server:start_link
,或者,如果您希望gen_server
成为监督树的一部分,请指示其主管生成它: