[elixir! #0037] Agent 小传
elixir! #0041
前言
Agent 是 elixir 中引入的一個(gè)新的抽象。 它建立在 GenServer 之上,它的
實(shí)現(xiàn)非常簡單。基本的機(jī)制就是 agent 進(jìn)程接收一個(gè)函數(shù), 然后對它的 state
執(zhí)行這個(gè)函數(shù)。
所以, agent 進(jìn)程可以在存取數(shù)據(jù)的同時(shí),用來對數(shù)據(jù)做一些輕量的處理。
它使得我們實(shí)現(xiàn)并發(fā)操作所需要的代碼變得更加簡單了。
注意
agent 的優(yōu)點(diǎn)
提供了一個(gè)可以從其他進(jìn)程訪問的數(shù)據(jù)存儲點(diǎn)
agent 的數(shù)量不限,而ets 表的數(shù)量默認(rèn)是 1400 個(gè)
使用起來很簡單
agent 的缺點(diǎn)
進(jìn)行 expensive 的操作可能會導(dǎo)致響應(yīng)超時(shí)
存取速度比 ets 慢
例子
在 elixir 自帶的構(gòu)建工具 Mix 的源碼中, 我們看到了對 Agent 這樣的使用方式:
defmodule Mix.Config.Agent do@moduledoc false@typep config :: Keyword.t@spec start_link() :: {:ok, pid}def start_link doAgent.start_link fn -> [] endend@spec stop(pid) :: :okdef stop(agent) doAgent.stop(agent)end@spec get(pid) :: configdef get(agent) doAgent.get(agent, &(&1))end@spec merge(pid, config) :: configdef merge(agent, new_config) doAgent.update(agent, &Mix.Config.merge(&1, new_config))end end它的作用是在編譯時(shí)臨時(shí)存儲應(yīng)用的配置信息, 具體可看這里。
總結(jié)
簡而言之, 如果你有這樣的需求:
一個(gè)可以從任何進(jìn)程訪問的數(shù)據(jù)存儲點(diǎn)
讓一個(gè)獨(dú)立的進(jìn)程來對數(shù)據(jù)進(jìn)行輕量處理
對速度要求不高(例如在編譯時(shí)使用)
不想占用 ets 表的份額
就可以考慮使用 Agent。
總結(jié)
以上是生活随笔為你收集整理的[elixir! #0037] Agent 小传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP多种序列化/反序列化的方法 js
- 下一篇: 当前页面怎么调用子集iframe页面的方