Erlang:gen_server - 回复两个客户端

时间:2016-06-17 17:07:50

标签: erlang erlang-ports

作为新手,使用gen_server编写玩具匹配(交易)引擎。

一旦发生交易/匹配,就需要通知两个客户。

文档说:

reply(Client, Reply) -> Result
     

类型:

Client - see below
Reply = term()
Result = term()
     

gen_server可以使用此函数显式发送回复   在回复时,调用call/2,3multi_call/2,3,4的客户端   无法在Module:handle_call/3的返回值中定义。

     

客户端必须是提供给回调函数的From参数。 回复是一个任意术语,将返回给   客户端作为call/2,3multi_call/2,3,4的返回值。

     

返回值Result未进一步定义,应始终为   忽略。

鉴于以上情况,如何向其他客户发送通知。

采取行动的样本

   C1 -> Place order  IBM,BUY,100,10.55
   Server -> Ack C1 for order
   C2 -> Place order  IBM,SELL,100,10.55
      Server -> Ack C2 for order
             -> Trade notification to C2
             -> Trade notification to C1 %% Can I use gen_server:reply() 
                                         %% If yes - How ?

1 个答案:

答案 0 :(得分:1)

嗯,你不能。您的ACK回复。 gen_server:call 合同只接受单个回复。我的意思是,gen_server:call只会等待一个回复。

通常gen_server:reply可以像

一样实现
reply({Pid, Ref}, Result) ->
    Pid ! {Ref, Result}.

这意味着如果您尝试发送多个回复,则只需在调用者进程的消息框中获取一些已发送的消息。

提案

相反,我相信,您应该使用一些引用向每个交易发送关联,并在ACK过程期间使用该引用CX_Ref向呼叫者发送消息。然后,当您必须发送通知时,您只需向{C1_Ref, Payload}C1向C2发送消息{C2_Ref, Payload}

此外,您可能需要引入一些监控来处理代理崩溃。