Elixir:如何在 handle_cast 中向服务器发送通知?

Elixir: How to send notification to server in handle_cast?

我正在制作可以 send/receive 异步消息的基本 Elixir server/client 模块。该模块如下所示。

defmodule Bitcoin.WorkerOne do
use GenServer

def start_link(opts) do
    IO.puts " - Worker 1 started - "
    GenServer.start_link(__MODULE__,:ok, opts)
end

def set_message(server, name, mid) do
    GenServer.cast(server, {:set_message, name})
end

#callbacks
def init(:ok) do
    names = []
    {:ok, names}
end

def handle_cast({:set_message, name},names) do
    IO.puts "- new state is - " 
    names = names ++name
    IO.inspect names
    {:noreply,names}
end

end

我正在使用 iex 控制台启动进程。

{:ok, pid1} = Bitcoin.WorkerOne.start_link([])
Bitcoin.WorkerOne.get_message(pid1, ["one"])

在上述之后,状态变为 ['one'](最初为空列表)。我想向服务器发送状态已更新的通知。我可以在 handle_cast 中调用 'Genserver.cast' 来发回消息吗?

在要发送通知的地方使用强制转换时,您应该在发送给服务器的消息中包含发送者的 pid,但最好结合使用调用和 GenServer.reply/2,返回 {:noreply, state} handle_call 该用例的回调,以保证服务器已收到请求。手动重新实现回复需要大量工作,具体取决于您需要什么保证,因此您应该避免它。