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

时间:2017-09-15 03:16:14

标签: elixir actor gen-server

我正在制作可以发送/接收异步消息的基本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,以便发回消息吗?

1 个答案:

答案 0 :(得分:2)

在使用要发送通知的演员表时,您应该在邮件中将发件人的pid包含在服务器中,但最好使用与GenServer.reply/2结合的调用,返回{ {1}}在该用例的{:noreply, state}回调中,以获得服务器收到请求的保证。手动重新实现回复是很多工作,取决于你需要什么保证,所以你应该避免它。