何时在Elixir中使用代理代替GenServer

seb*_*now 1 erlang elixir gen-server

在阅读GenServerAgent的文档时,我想知道哪些Agent解决方案无法解决用例GenServer?所以,当喜欢AgentGenServer

我知道您自己的代理中定义的功能会在代理进程本身上执行,因此可以肯定这是一个很大的区别。

Ale*_*nov 6

在阅读GenServer和Agent的文档时,我想知道Agent解决GenServer无法解决的用例是什么?

没有一个GenServer 不能实现,因为它Agent是在之上实现的GenServer(并且很简单,只需查看源代码)。

那么,何时选择Agent而不是GenServer?

当特殊情况实施时Agent就足够了。例如:没有异步回复,在调用和强制转换之间没有区别,等等。

我知道您自己的代理中定义的功能会在代理进程本身上执行

它不是“在您自己的代理中定义”的函数,而是那些作为参数传递给Agent.get/ update/ etc的函数。

来自文档的示例:

# Compute in the agent/server
def get_something(agent) do
  Agent.get(agent, fn state -> do_something_expensive(state) end)
end

# Compute in the agent/client
def get_something(agent) do
  Agent.get(agent, & &1) |> do_something_expensive()
end
Run Code Online (Sandbox Code Playgroud)