从 Mod:handle_cast 调用 gen_server:cast

Posted

技术标签:

【中文标题】从 Mod:handle_cast 调用 gen_server:cast【英文标题】:Calling gen_server:cast from Mod:handle_cast 【发布时间】:2012-12-05 22:58:25 【问题描述】:

这是我的代码:

handle_cast(start, #statestarted = false = State) ->
    gen_server:cast(self(), add_process),
    noreply, State#statestarted = true;
handle_cast(add_process, State) -> ...

可以从 handle_cast 函数内部调用 gen_server:cast 吗?我期望它做的是handle_cast 将返回一个新状态,然后立即处理add_process 消息。

【问题讨论】:

【参考方案1】:

这是正确的,只是消息可能不会被“立即”处理——它被放在消息队列中,队列中它之前的消息将被首先处理。

您可能已经知道,这适用于gen_server:cast 和使用! 发送的消息,但不适用于gen_server:call,这会导致这里出现死锁。

【讨论】:

我不清楚您所说的 gen_server:call 会导致死锁吗?怎么样? 如果 gen_server 进程调用自身,它会发送消息并等待响应——但响应永远不会到达,因为在等待响应时它没有监听调用。 那么我们如何进行内部调用并在没有种族的情况下保持状态一致?因为 gen_server:cast 是异步的,并且“可能”返回新状态 进行简单的函数调用(通常是同一模块中的内部函数),而不是 gen_server 调用。 gen_server 调用适用于您需要不同的进程来做某事时。 我一直有这个设计问题。谢谢

以上是关于从 Mod:handle_cast 调用 gen_server:cast的主要内容,如果未能解决你的问题,请参考以下文章

通过 Jinterface 调用 gen_server?

halcon算子翻译——gen_image3_extern

使用 tera gen 时,从 kv.local/172.20.12.168 到 localhost:8020 的调用因连接异常而失败

如何从命令行将主机名传递给gen_tcp

生成器的高级特性

从scipy.stats._continuous_distns.beta_gen对象中读取scipy.beta分发参数