【问题标题】:Elixir: How to send notification to server in handle_cast?Elixir:如何在 handle_cast 中向服务器发送通知?
【发布时间】:2018-02-24 03:33:42
【问题描述】:

我正在制作可以发送/接收异步消息的基本 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'] (最初为空列表)。我想向服务器发送状态已更新的通知。我可以在handle_cast 中调用'Genserver.cast' 以发回消息吗?

【问题讨论】:

    标签: elixir actor gen-server


    【解决方案1】:

    当使用强制类型转换来发送通知时,您应该在发送到服务器的消息中包含发件人的 pid,但最好将调用与 GenServer.reply/2 结合使用,在 handle_call 回调中返回 {:noreply, state}用例,以获得服务器收到请求的保证。手动重新实现回复的工作量很大,具体取决于您需要什么保证,因此您应该避免这样做。

    【讨论】:

    • 如果是handle_call,它会等待任务完成。 {:noreply, state} 可以解决这个问题吗?
    • 当您需要回复或保证服务器收到请求并对其进行操作时,使用来自客户端的调用很重要。如果您返回{:noreply, state},则预计您已经回复或将来使用GenServer.reply/2 回复。这使您可以控制何时发送回复,同时保持调用提供的保证,包括处理超时和崩溃。调用者会阻塞,但您可以尽早回复以尽量减少这种情况,或者如果请求确实触发并忘记,则使用强制转换和施法者的 pid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2022-08-10
    • 2014-08-12
    • 2014-06-06
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多