[elixir! #0037] Agent 小传
生活随笔
收集整理的這篇文章主要介紹了
[elixir! #0037] Agent 小传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
elixir! #0041
前言
Agent 是 elixir 中引入的一個新的抽象。 它建立在 GenServer 之上,它的
實現非常簡單。基本的機制就是 agent 進程接收一個函數, 然后對它的 state
執行這個函數。
所以, agent 進程可以在存取數據的同時,用來對數據做一些輕量的處理。
它使得我們實現并發操作所需要的代碼變得更加簡單了。
注意
agent 的優點
提供了一個可以從其他進程訪問的數據存儲點
agent 的數量不限,而ets 表的數量默認是 1400 個
使用起來很簡單
agent 的缺點
進行 expensive 的操作可能會導致響應超時
存取速度比 ets 慢
例子
在 elixir 自帶的構建工具 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它的作用是在編譯時臨時存儲應用的配置信息, 具體可看這里。
總結
簡而言之, 如果你有這樣的需求:
一個可以從任何進程訪問的數據存儲點
讓一個獨立的進程來對數據進行輕量處理
對速度要求不高(例如在編譯時使用)
不想占用 ets 表的份額
就可以考慮使用 Agent。
總結
以上是生活随笔為你收集整理的[elixir! #0037] Agent 小传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP多种序列化/反序列化的方法 js
- 下一篇: C#中的System.Net.Socke