据说函数是 Elixir/Erlang 中的一等公民。函数可以作为消息传递吗?
在探索 Elixir API 时,我遇到了Agent#get_and_update(agent, fun, timeout \\ 5000). 我想获取和更新操作是原子的。我认为这是可能的唯一方法是fun在代理进程而不是与代理交互的客户端进程上运行。
如果fun在客户端进程上运行,则会带来许多有关保证原子性和客户端进程失败的问题。
是的你可以。
来自 的代理文档get_and_update/3。
该函数
fun被发送到agent调用传递代理状态的函数。
代理进程本身运行该函数,以原子方式更新其状态。
在幕后,特工只是一个专门的GenServer。因此,如果我们查看 的代码get_and_update/3,我们可以看到我们实际上只是将函数传递给 aGenServer来运行。
@spec get_and_update(agent, (state -> {a, state}), timeout) :: a when a: var
def get_and_update(agent, fun, timeout \\ 5000) when is_function(fun, 1) do
GenServer.call(agent, {:get_and_update, fun}, timeout)
end
Run Code Online (Sandbox Code Playgroud)