[elixir! #0012] 漫话源码之Agent

我们知道 Elixir 有一个从 Erlang 那里继承来的重要特性 —— immutable, 所以我们不能像 OO语言那样简单地用变量存储临时数据. 因此, Agent 出现了.

Agent 是关于 state 的简单抽象. state 可以解释为数据的某个状态. 在 Elixir 里经常需要在不同进程之间, 或者是同一个进程在不同的时间点, 分享或存储 state.

Agent 是一个基础的服务器实现, 它提供了简单的 API, 帮助我们对 state 进行获取与更新.

所有传送给 agent 的函数都会在 agent 里执行. 所以要避免在 agent 中进行昂贵的操作.

对比这两个例子:

# 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

第一个例子阻塞了 agent, 第二个例子将所有的 state 复制到客户端执行. 选择哪种方式取决于数据的大小, 是否大到需要在服务器执行, 或是小到可以传送到客户端.

agent 提供了两种 API, 一种是匿名函数, 另一种是确定的模块函数和参数. 使用分布式 agent 的时候最好选择后者.

agent 可以热更新代码, 只需要简单地传送一个模块,函数和参数的元组到更新命令里. 例如:

{:update, :sample, {:advanced, {Enum, :into, [%{}]}}}

agent 的 state 会被当做第一个参数添加到参数列表里.

Agent 模块里的主要函数

@spec start_link((() -> term), GenServer.options) :: on_start
@spec start_link(module, atom, [any], GenServer.options) :: on_start
启动一个包含了给定的函数, 链接到当前进程的 agent.

@spec start((() -> term), GenServer.options) :: on_start
@spec start(module, atom, [any], GenServer.options) :: on_start
启动一个没有链接的 agent. (在监督树之外)

@spec get(agent, (state -> a), timeout) :: a when a: var
@spec get(agent, module, atom, [term], timeout) :: any
通过给定的函数获取 agent 的值.

@spec get_and_update(agent, (state -> {a, state}), timeout) :: a when a: var
@spec get_and_update(agent, module, atom, [term], timeout) :: any
获取并更新 agent state.

@spec update(agent, (state -> state), timeout) :: :ok
@spec update(agent, module, atom, [term], timeout) :: :ok
更新 agent state.

@spec cast(agent, (state -> state)) :: :ok
@spec cast(agent, module, atom, [term]) :: :ok
在 agent state 中执行一个 cast 操作.

@spec stop(agent, reason :: term, timeout) :: :ok
以给定的原因关闭 agent.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
Elixir是一种运行在Erlang虚拟机上的函数式编程语言,它具有并发性、容错性和高可扩展性。学习Elixir可以帮助我们更好地理解函数式编程的思维方式,提高并发编程的能力,并且为构建可靠的、高性能的分布式应用提供了一种优秀的工具。 首先,学习Elixir可以让我们更好地理解并掌握函数式编程的思维方式。函数式编程强调不可变性、纯函数和高阶函数等概念,这些概念在Elixir中得到了很好的体现。通过学习Elixir,我们可以学会如何编写函数式风格的代码,提高代码的可读性和可维护性。 其次,Elixir的并发编程特性也是学习的重点之一。Elixir提供了轻量级的原生线程——进程,以及消息传递机制来实现并发。通过学习Elixir,我们可以了解如何使用进程来实现并发编程,以及如何避免常见的并发编程问题,如死锁和竞争条件。 再者,学习Elixir还可以帮助我们构建高性能的分布式应用。由于Elixir建立在Erlang虚拟机之上,所以它继承了Erlang对于分布式应用的支持。在Elixir中,我们可以轻松地编写分布式系统,并且可以利用Erlang提供的强大的容错机制来确保系统的可靠性。 综上所述,学习Elixir对我们来说是非常有价值的。通过学习Elixir,我们可以更好地理解函数式编程的思维方式,提高并发编程的能力,并且为构建可靠的、高性能的分布式应用提供了一种强大的工具。因此,学习Elixir将使我们成为更加全面和高效的程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值