gpt4 book ai didi

elixir - GenServer.call 产生 "no process"错误

转载 作者:行者123 更新时间:2023-12-02 03:45:49 25 4
gpt4 key购买 nike

我有一个使用 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

我正在启动服务器:

$ 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

最佳答案

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

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

关于elixir - GenServer.call 产生 "no process"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46785245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com