Elixir 中何时使用 Agent 代替 GenServer

问题描述 投票:0回答:2

在阅读 GenServerAgent 的文档时,我想知道

Agent
解决了
GenServer
无法解决的用例是什么?那么,什么时候更喜欢
Agent
而不是
GenServer

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

erlang elixir gen-server
2个回答
11
投票

在阅读 GenServer 和 Agent 的文档时,我想知道 Agent 可以解决哪些 GenServer 无法解决的用例?

没有,

GenServer
不能,因为
Agent
是在
GenServer
之上实现的(很简单,只需查看)。

那么,什么时候更喜欢 Agent 而不是 GenServer?

Agent
实现的特殊情况足够时。例如:没有异步回复、调用和强制转换之间没有区别等

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

它不是“在您自己的代理中定义”的函数,而是那些作为参数传递给

Agent.get
/
update
/等的函数。

文档中的示例:

# 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

0
投票

我遇到的一个用例是,如果您有数百万个操作需要更新并获取更新后的值,您可能希望使用普通的

GenServer
而不是
Agent

因为 get_and_update 返回未修改的内容,所以您必须先执行

Agent.update
,然后执行 和
Agent.get

我在解决一些 leetcode/AdventOfCode 问题时遇到了这个性能问题。

如果 GenServer 通过,代理会给出

Time Limit Exceeded
输出。

© www.soinside.com 2019 - 2024. All rights reserved.