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
该用例的回调,以保证服务器已收到请求。手动重新实现回复需要大量工作,具体取决于您需要什么保证,因此您应该避免它。
我正在制作可以 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
该用例的回调,以保证服务器已收到请求。手动重新实现回复需要大量工作,具体取决于您需要什么保证,因此您应该避免它。