GenServer.call 产生“无进程”错误

Héc*_*tor 2 elixir gen-server

我有一个使用 ETS 的原始缓存的 GenServer/客户端实现:

defmodule Cache do
    use GenServer

    def start_link() do
        GenServer.start_link(__MODULE__, [])
    end

    def fetch(key, def_value) do
        case get(key) do
            {:not_found} -> set(key, def_value)
            {:found, result} -> result
        end
    end

    defp get(key) do
        case GenServer.call(__MODULE__, {:get, key}) do
            [] -> {:not_found}
            [{_, result}] -> {:found, result}
        end
    end

    defp set(key, value) do
        GenServer.call(__MODULE__, {:set, key, value})
    end

    # GenServer callbacks

    def handle_call({:get, key}, _from, state) do
        result = :ets.lookup(:my_table, key)
        {:reply, result, state}
    end

    def handle_call({:set, key, value}, _from, state) do
        true = :ets.insert(:my_table, {key, value})
        {:reply, value, state}
    end

    def init(_args) do
        :ets.new(:my_table, [:named_table, :set, :private])
        {:ok, %{}}
    end

end
Run Code Online (Sandbox Code Playgroud)

我正在启动服务器:

$ iex -S mix
$ {:ok, pid} = Cache.start_link
{:ok, #PID<0.139.0>}
Run Code Online (Sandbox Code Playgroud)

但是当我调用某个函数时:

$ Cache.fetch(:key, "value")
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

** (exit) exited in: GenServer.call(Cache, {:get, 1}, 5000) ** (EXIT) no process: 该进程不活动或当前没有与给定名称关联的进程,可能是因为它的应用程序未启动

Dog*_*ert 5

根据您的GenServer.call调用,我假设您想启动一个与模块同名注册的进程。在这种情况下,您忘记传递name: __MODULE__GenServer.start_link调用Cache.start_link

def start_link do
  GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
Run Code Online (Sandbox Code Playgroud)