【问题标题】:Message Evaluation消息评估
【发布时间】:2014-10-05 02:37:33
【问题描述】:

当我的 GenServer 从外部队列/主题接收消息时,它总是以 n handle_info [被从外部调用]结束。所以,只是想知道,

  1. 以这种方式接收所有消息是件好事,因为我必须始终通过评估消息来调用函数,或者还有其他方式。 例如,用户分享他的详细信息,向其他用户发送消息等。

    我创建了一个 GenServer 并启动了该过程,现在客户端可以向某个队列发送消息以注册他们的详细信息[姓名、电话号码等]。

  2. 现在,当从客户端收到新消息时,我无法从 handle_info 获取任何 PID。 那么,我怎样才能使流程特定于该用户。

    def handle_info({_, data}, state) do
      {:noreply, state}
    end

【问题讨论】:

  • 您可以将消息中的self发送到GenServer...
  • 不清楚您的问题是什么意思,但是您可以在任何地方调用 self 并获取执行时您所在的进程的 Pid。 GenServer 只是正常流程之上的一种通用行为。在这里您可以找到有关 GenServers 的好信息:learnyousomeerlang.com/clients-and-servers
  • 调用 GenServer 的最佳方式是使用 GenServer.call/2。正如 Uri Agassi 指出的那样,如果您需要调用者,您可以使用 self() 显式传递它。

标签: elixir


【解决方案1】:

由于您使用的是GenServer(或erlangs gen_server),因此您不应发送消息以显式处理(使用!),而应使用call(如果您希望从服务器返回一些值)和@ 987654322@(如果你只是想发送一些日期,而不需要等待响应。

第二件事是你也不应该将你的模块客户端暴露给GenServer 接口。与其让它们调用GenServer:call,不如将​​其包装在模块中的某个函数中。如果你实现一些你反击的国王,你可以写这样的东西

def increase(counter) do 
   GenServer.cast(conter, {:increase})
done

def get_count(counter) do 
   GenServer.call(counter, {get_coung})
done

并在各自的handle... 函数中处理它们。

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2011-05-08
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多