我正在制作可以发送/接收异步消息的基本Elixir服务器/客户端模块。该模块如下所示。
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'](最初为空列表)。我想向服务器发送状态已更新的通知。我可以在'Genserver.cast'
内拨打handle_cast
,以便发回消息吗?
答案 0 :(得分:2)
在使用要发送通知的演员表时,您应该在邮件中将发件人的pid包含在服务器中,但最好使用与GenServer.reply/2
结合的调用,返回{ {1}}在该用例的{:noreply, state}
回调中,以获得服务器收到请求的保证。手动重新实现回复是很多工作,取决于你需要什么保证,所以你应该避免它。