gpt4 book ai didi

Erlang 异步消息处理与 gen_server :cast/2

转载 作者:行者123 更新时间:2023-12-02 06:56:18 25 4
gpt4 key购买 nike

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

我在 OTP ssh 模块中看到过一个示例,它通过module:handle_cast/2,保存在模块的本地队列中,稍后通过显式向调用者发送消息的方式发回与请求对应的回复消息。当我尝试阅读它时,我几乎无法跟踪代码,也无法理解其中的想法。

一段伪代码值得赞赏。

最佳答案

我相信您指的是ssh_connection_manager模块。

当您执行 gen_server:cast/2 时,请求将在 Module:handle_cast/2 函数中处理。这里需要注意一些事情:

  • handle_cast 参数中,您没有有关发送者的信息,因此您无法(除非您在消息本身内发送此信息)向发送者发回一些结果。
  • 客户端发出 gen_server:cast/2 后,不会等待回复。实际上,它甚至不关心消息是否到达(有一些异常(exception))。
  • handle_cast/2 中,您只能返回一个 noreplystop 元组,因此无法在那里返回回复。

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

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

    • A.在handle_call中返回类似{noreply NewState}的内容。这将使您能够在客户端仍在等待时处理其他请求。当结果准备好后,您可以使用 gen_server:reply() 将其发送回客户端。
    • B.返回 {reply, ok, State} 给客户端。客户端将继续执行,可能会执行一系列cast/2。然后,客户端将使用新的 gen_server:call/2 询问您最终结果。

关于Erlang 异步消息处理与 gen_server :cast/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com