从 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 tera gen 时,从 kv.local/172.20.12.168 到 localhost:8020 的调用因连接异常而失败