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 客户端-服务器示例未收到任何内容
Warning: Leaking Caffe2 thread-pool after fork
为啥我在启动模拟器时会收到此 GRPC 错误“WARNING: EmulatorService.cpp:448: Cannot find certfile”?