elixir - Elixir 是否提供了一种更简单的方法来获取 GenServer 进程的当前状态?

标签 elixir gen-server

给定一个简单的 GenServer过程。

defmodule KVServer do
  use GenServer

  def start do
    GenServer.start(__MODULE__, %{}, name: :kv_server)
  end

  def store(k, v) do
    GenServer.cast(:kv_server, {:store, k, v})
  end

  def handle_cast({:store, k, v}, state) do
    {:noreply, Map.put(state, k, v)}
  end
end

我可以使用 :sys.get_status/1 获取当前进程状态
iex(1)> {:ok, pid} = KVServer.start
{:ok, #PID<0.119.0>}
iex(2)> KVServer.store(:a, 1)
:ok
iex(3)> KVServer.store(:b, 2)
:ok
iex(4)> {_,_,_,[_,_,_,_,[_,_,{_,[{_,state}]}]]} = :sys.get_status(pid)
...
iex(5)> state
%{a: 1, b: 2}

只是想知道 Elixir 是否提供了一种更简单的方法来获得 GenServer进程的当前状态?

最佳答案

使用 :sys.get_state/1 :

iex(1)> {:ok, pid} = KVServer.start
{:ok, #PID<0.86.0>}
iex(2)> KVServer.store(:a, 1)
:ok
iex(3)> KVServer.store(:b, 2)
:ok
iex(4)> :sys.get_state(pid)
%{a: 1, b: 2}

关于elixir - Elixir 是否提供了一种更简单的方法来获取 GenServer 进程的当前状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39032156/

相关文章:

metaprogramming - case 表达式中的 `unquote` 和 `binding_quote`

recursion - Elixir 中的递归是如何工作的

elixir - Elixir 中是否有 python 的 timeit 的等效模块?

elixir - 在分块模式下保持 Elixir Plug 连接打开

erlang - 解决两个 gen_tcp 之间的死锁

elixir - 每次测试后停止 GenServer

elixir - :ok init argument in Elixir's GenServer example?有什么意义

Erlang:gen_server 还是我自己的自定义服务器?

docker - Docker 上的 Erlang/Elixir 和热代码交换