gpt4 book ai didi

dictionary - Elixir 中的 HashDict 和 OTP GenServer 上下文

转载 作者:行者123 更新时间:2023-12-02 09:29:57 25 4
gpt4 key购买 nike

我在 OTP 中使用 HashDict 函数时遇到问题。我想使用一个 GenServer 进程来put,并使用另一个进程来fetch。当我尝试实现这一点时,当从同一个 GenServer 调用时,我可以从 HashDict 中放置和获取项目;它工作得很好(在下面的示例中是MyServerA)。但是,当我使用一台 GenServer 来放置并使用另一台 GenServer 来获取时,获取实现不起作用。为什么是这样?大概是因为我需要在三个不同进程之间传递 HashDict 数据结构?

代码示例如下:

我使用一个简单的调用将一些状态发送到 MyServerB:

    MyServerA.add_update(state)

对于MyServerB,我已经实现了HashDict,如下所示:

defmodule MyServerB do
use GenServer

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

def init([]) do
#Initialise HashDict to store state
d = HashDict.new
{:ok, d}
end

#Client API
def add_update(update) do
GenServer.cast __MODULE__, {:add, update}
end

def get_state(window) do
GenServer.call __MODULE__, {:get, key}
end

# Server APIs
def handle_cast({:add, update}, dict) do
%{key: key} = update
dict = HashDict.put(dict, key, some_Value)
{:noreply, dict}
end

def handle_call({:get, some_key}, _from, dict) do
value = HashDict.fetch!(dict, some_key)
{:reply, value, dict}
end
end

因此,如果我从另一个进程使用 MyServerB.get_state(dict,some_key),我似乎无法返回 HashDict 的内容。 .

更新:

所以如果我使用 ETS,我会得到这样的结果:

def init do
ets = :ets.new(:my_table,[:ordered_set, :named_table])
{:ok, ets}
end

def handle_cast({:add, update}, state) do
update = :ets.insert(:my_table, {key, value})
{:noreply, ups}
end

def handle_call({:get, some_key}, _from, state) do
sum = :ets.foldl(fn({{key},{value}}, acc)
when key == some_Key -> value + acc
(_, acc) ->
acc
end, 0, :my_table)
{:reply, sum, state}
end

所以,cast 再次起作用 - 当我使用 observer 检查时,我可以看到它填充了我的键值对。但是,当我尝试 call 时,它又什么也没有返回。所以我想知道我是否错误地处理了状态?任何帮助,感激不尽?

谢谢

最佳答案

您的问题在于此声明:

I would like to use one GenServer process to put and a different one to fetch.

在 Elixir 中,进程无法共享状态。因此,你不能让一个进程拥有数据,而另一个进程直接读取数据。例如,您可以将 HashDict 存储在一个进程中,然后让另一个进程向第一个进程发送消息以请求数据。这将使它看起来像您所描述的那样,但是在幕后,所有交易仍然会经过第一个过程。有一些技术可以以分布式/并发方式执行此操作,以便利用多个内核,但这可能比您目前想要做的工作更多。

看看 ETS,它允许您创建公共(public)表并从多个进程访问数据。

关于dictionary - Elixir 中的 HashDict 和 OTP GenServer 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34271159/

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