代码之家  ›  专栏  ›  技术社区  ›  Héctor

发电机服务器。调用产生“无进程”错误

  •  2
  • Héctor  · 技术社区  · 8 年前

    我使用ETS实现了一个简单缓存的GenServer/client实现:

    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")
    

    我遇到了这个错误:

    **(退出)退出:GenServer。调用(缓存,{:get,1},5000) **(退出)无进程:进程不活动或当前没有与给定名称关联的进程,可能是因为其 应用程序未启动

    1 回复  |  直到 8 年前
        1
  •  5
  •   Dogbert    8 年前

    基于您的 GenServer.call 调用,我假设您希望启动一个与模块同名的进程。那样的话,你忘了通过 name: __MODULE__ GenServer.start_link 请来 Cache.start_link :

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