在阅读 GenServer 和 Agent 的文档时,我想知道
Agent
解决了 GenServer
无法解决的用例是什么?那么,什么时候更喜欢 Agent
而不是 GenServer
?
我知道您自己的代理中定义的函数会在代理进程本身上执行,所以这肯定是一个很大的区别。
在阅读 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
我遇到的一个用例是,如果您有数百万个操作需要更新并获取更新后的值,您可能希望使用普通的
GenServer
而不是 Agent
。
因为 get_and_update 返回未修改的内容,所以您必须先执行
Agent.update
,然后执行 和 Agent.get
我在解决一些 leetcode/AdventOfCode 问题时遇到了这个性能问题。
如果 GenServer 通过,代理会给出
Time Limit Exceeded
输出。