【问题标题】:Erlang message queue clutterErlang 消息队列混乱
【发布时间】:2018-09-12 03:58:19
【问题描述】:

我不太确定如何找到此类问题的答案。在 Erlang 中,每个进程都有一个消息队列。发送到进程的消息可能与该特定进程的任何模式都不匹配。如果是这种情况,则进程将消息留在队列中并继续检查其他消息。我的问题是:

这不会造成轻微的内存泄漏吗?

假设一个进程可能会继续接收它无法匹配的消息,并不断增长,不断增长并最终导致问题。 Erlang 如何处理这种情况?我知道 Erlang 有一个超时实现,但是如果这些消息没有超时,这会导致问题吗?是否有任何类型的默认垃圾收集?

【问题讨论】:

  • 这不会造成轻微的内存泄漏吗? -- 是的。 Erlang 如何处理这种情况? -- Other -> ok

标签: process erlang message-queue


【解决方案1】:

这不会造成轻微的内存泄漏吗?

是的,选择性接收会导致进程耗尽内存。

Erlang 如何处理这种情况?

receive 
    Pattern1 -> %% do something;
    Pattern2 -> %% do something else;
    Other -> ok
end

或者,经过一段时间后:

myflush() ->
    receive 
        _Any -> myflush()
    after 0 ->  % If at any time there are no messages in the mailbox, this executes.
        ok
    end.

【讨论】:

  • 所以 _Any -> myflush() 只是再次调用该函数以继续等待潜在的消息。但是,如果消息不匹配任何模式,那么 after 发生只是结束该过程?也感谢您的好评!
  • 实际上,我在 learnyousomeerlang 上找到了这个“当这种情况发生时,Erlang VM 将尝试找到符合其中一种可用模式的消息。在上述情况下,任何匹配。只要有消息,flush/0函数会递归调用自己,直到邮箱为空。一旦完成,代码的0->ok部分将被执行,函数返回“
猜你喜欢
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2013-04-28
  • 1970-01-01
  • 2019-09-06
  • 2015-02-16
相关资源
最近更新 更多