使用gen_server进行Erlang异步消息处理:cast/2

jj1*_*bdx 4 erlang gen-server

我正在寻找使用gen_server:cast/2 的Erlang 异步消息处理的好例子.

我在OTP ssh模块中看到了一个示例,该模块通过Module:handle_cast/2接收请求,将其保存在模块的本地队列中,并通过显式发送消息发回与该请求相对应的回复消息给来电者.当我试图阅读它时,我几乎无法跟踪代码,并且无法理解这个想法.

一段伪代码是值得赞赏的.

Rob*_*loi 5

我相信你指的是ssh_connection_manager模块.

执行a时gen_server:cast/2,请求在Module:handle_cast/2函数中处理.这里有几点需要注意:

  • handle_cast参数中,您没有关于发件人的信息,因此您不能 - 除非您在邮件本身内发送此信息 - 请将一些结果发回给它.
  • 发出后,客户gen_server:cast/2不会等待回复.实际上,它甚至不关心消息是否到达(有一些例外).
  • 在一个handle_cast/2,你可以只返回一个noreply或一个停止元组,所以无法在那里返回一个回复.

说,你一直在看的代码背后的想法应该是(简化事情):

  • 的初始同步 gen_server:call/2是由
  • 客户端的From被传递到服务器并保存到其状态(实际上,似乎使用该参数创建了一个额外的进程).当您无法在handle_call时计算返回值时,此技巧很有用.
  • 此时,您需要两种可能性,具体取决于您是否需要更多信息来计算来自其他客户端(A)或来自同一客户端(B)的结果:

    • A.在handle_call中返回{noreply NewState}之类的内容.这将使您可以在客户端仍然持有时处理其他请求.结果准备就绪后,您可以使用gen_server:reply()将其发送回客户端.
    • B.将{reply,ok,State}返回给客户.客户端将继续执行,可能执行一系列强制转换/ 2.然后,客户端将以新的方式询问您最终结果gen_server:call/2.