2017-10-17 70 views
1

我有这样一个天真的缓存GenServer /客户端执行使用ETS:GenServer.call生产 “无进程” 的错误

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 

我开始了服务器:

$ iex -S mix 
$ {:ok, pid} = Cache.start_link 
{:ok, #PID<0.139.0>} 

但是,当我调用一些功能:

$ Cache.fetch(:key, "value") 

我得到这个错误:

** (exit) exited in: GenServer.call(Cache, {:get, 1}, 5000) ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started

回答

2

根据您的GenServer.call调用,我假设您想要启动一个与模块名称相同的进程。在这种情况下,你忘了通过name: __MODULE__GenServer.start_link呼叫Cache.start_link

def start_link do 
    GenServer.start_link(__MODULE__, [], name: __MODULE__) 
end 
+0

谢谢!它的工作原理:D –