Erlang:gen_服务器-回复两个客户端

Erlang:gen_服务器-回复两个客户端,erlang,erlang-ports,Erlang,Erlang Ports,作为新手,使用gen_server编写玩具匹配(交易)引擎 一旦交易/匹配发生,需要通知双方客户 文件说: 类型: Client - see below Reply = term() Result = term() gen_服务器可以使用此函数显式发送回复 当应答时,发送到调用call/2,3或多用户呼叫/2,3,4的客户端 无法在模块:句柄调用/3的返回值中定义 客户端必须是提供给回调函数的From参数。Reply是一个任意术语,将返回给 客户端作为call/2,3或multi\u call

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

一旦交易/匹配发生,需要通知双方客户

文件说:

类型:

Client - see below
Reply = term()
Result = term()
gen_服务器可以使用此函数显式发送回复 当应答时,发送到调用
call/2,3
多用户呼叫/2,3,4
的客户端 无法在
模块:句柄调用/3
的返回值中定义

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

返回值结果没有进一步定义,应该始终 忽略

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

动作顺序示例

   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 ?

嗯,你不能。您的
ACK
已经是回复。而且,
genu服务器:call
contract只接受一次回复。我的意思是,
gen_server:call
只会等待一个回复

一般来说,
genu服务器:reply
可以像

reply({Pid, Ref}, Result) ->
    Pid ! {Ref, Result}.
这意味着,如果您尝试发送多个回复,您只会在调用者进程的消息框中收到一些奇怪的消息

提议 相反,我认为,在确认过程中,您应该发送将每个交易与某个参考关联的消息,并使用该参考
CX_Ref
向调用者发送消息。然后,当您必须发送通知时,您只需将消息
{C1_-Ref,Payload}
发送到
C1
{C2_-Ref,Payload}
发送到C2


另外,您可能需要引入一些监控来处理经纪人崩溃。

Thanx为了澄清,这是否意味着gen_服务器不适合交易引擎,使用另一个gen_*是有意义的,这是推荐的。@CSP,我不是说,gen_服务器不合适,我不是说它是最好的解决方案。我相信你可以从它开始,但你以后可能想改变这个决定。
reply({Pid, Ref}, Result) ->
    Pid ! {Ref, Result}.