Erlang 收到 ***WARNING***

Posted

技术标签:

【中文标题】Erlang 收到 ***WARNING***【英文标题】:Erlang receive ***WARNING*** 【发布时间】:2018-01-27 18:22:37 【问题描述】:

我有一个处于循环中并接收命令的进程。

receive
    increase ->
        ...
    decrease ->
        ...
    after 5000 ->
        ...
end

但是当我用数千条消息轰炸它时,它会崩溃并收到这些警告。

警告信息:

***WARNING*** Unexp msg <0.106.0>,rec_acked, info running,
                                                     ['_UserConnections',20],
                                                     ieval,3994,34,log,
                                                      clientLogging,
                                                      [20],
                                                      false

有没有办法解决这个问题?它会导致任何问题吗?

感谢您的回答!

【问题讨论】:

你可以尝试创建一个简化的测试用例来触发这个警告吗?这是我能找到的关于这个确切警告的唯一实例:github.com/erlang/otp/blob/…。不知道为什么该进程会收到 rec_acked 消息。 如果大约 1000 多个进程向 1 个 PID(循环)发送消息,就会发生这种情况。 必须有一些额外的条件触发这个。我刚刚从 2000 个生成的进程向单个进程发送了 2000 条消息,并且没有警告消息(总共 400 万条消息)。 Erlang VM 目前正在使用 500MB 以上的 RAM,因为主进程尚未处理任何消息。 你用的是什么版本?我正在使用 18.3(由于需要此版本的库) @Dogbert 这仅在调试时显示。 【参考方案1】:

此代码仅用于示例和练习,但不要在生产环境中运行。 您应该始终从进程邮箱接收所有消息,并在收到后选择您想要的。

handle_message() ->
    receive
        Msg ->
            handle_message(Msg)
    after 5000 ->
            handle_timeout()
    end.

handle_message(increase) ->
    ...;
handle_message(decrease) ->
    ...;
handle_message(_) ->
    %% Back to receiving loop
    handle_message(). 

您应该阻止填充进程邮箱。 在生产就绪的应用程序中,通常没有人使用receive 语句,他们通常使用一些标准代码,这些代码处理接收、超时、回复、休眠等。我们将这些代码称为行为,例如一个OTP 标准行为的数量为 gen_server behavior 因为 OTP 行为是通用的,如果你需要非常高效的代码来执行某些特殊任务,你必须编写一个名为 Special process 的东西来处理你自己的消息和 Erlang 系统消息。

【讨论】:

谢谢!我假设 gen_server 的准系统只是一个循环接收?另外,如何防止填充进程邮箱?您可以猜到,这段代码只是增加/减少连接的用户。 另外,有了答案,我仍然收到这些消息! 你能显示代码吗?只向一个进程发送消息? 我有大约 10k+ 进程发送到这 1 个进程。 @Pouriya 您能否引用“您应该始终从进程邮箱接收所有消息并在收到后选择您想要的内容。”?在我看来,这抛弃了一个重要的能力:通过匹配receive 表达式,使某些消息优先于其他消息的能力。

以上是关于Erlang 收到 ***WARNING***的主要内容,如果未能解决你的问题,请参考以下文章

使用 gen_tcp 的 Erlang 客户端-服务器示例未收到任何内容

Erlang:为什么这会以'badarith'异常失败?

Erlang 中的并发性

将列显示为行

Warning: Leaking Caffe2 thread-pool after fork

为啥我在启动模拟器时会收到此 GRPC 错误“WARNING: EmulatorService.cpp:448: Cannot find certfile”?