【问题标题】:Erlang cast message to global gen_serverErlang 将消息投射到全局 gen_server
【发布时间】:2011-08-09 06:36:47
【问题描述】:

这是上一集question的继续

我有 gen_server:

start(UserName) ->
    case gen_server:start({global, UserName}, player, [], []) of
    {ok, _} ->
        io:format("Player: " ++ UserName ++ " started");
    {error, Error} ->
        Error
    end
    ...

如何正确地将消息发送到这个 gen_server。例如:在我制作的另一个文件中:

gen_server:cast(test, message).

在我的 gen_server 文件中,我有:

handle_cast(message, State) ->
    io:format("Message receiving \r\n"),
    {noreply, State};

我用测试名称启动我的 gen_server:

服务器:开始(测试)。 测试开始

当我调用gen_server:cast(test, message). 时,shell 中没有任何输出。如何检查 handle_cast 调用与否?

谢谢。

【问题讨论】:

标签: erlang gen-server


【解决方案1】:

代替

gen_server:cast(test, message).

gen_server:cast({global, test}, message).

如果您将 name 注册为 {global, name},则必须将其称为 {global, name}

如果您的处理程序被调用,它将在 shell 中打印“消息接收 \r\n”。你是通过 io:format 调用实现的。

【讨论】:

  • 好吧,它实际上只会崩溃 - io:format 需要两个参数。此外,它会在其组长打印的任何地方打印出来,这可能是也可能不是您所在的外壳。
  • 有函数io:format/1 和io:format/2,所以不会崩溃。至少不在 io:format 调用中。
  • 是的,你是对的 - io:format/1 可以正常工作。我很想建议使用 error_logger:info_msg/2 而不是 io:format 来处理这种事情,因为输出几乎总是有用的地方。对于普通的 io:format 调用,情况不一定如此。
猜你喜欢
  • 2011-11-15
  • 2014-04-30
  • 1970-01-01
  • 2019-01-23
  • 2011-08-09
  • 2014-11-09
  • 2012-04-11
  • 2011-10-08
  • 2016-08-09
相关资源
最近更新 更多