gpt4 book ai didi

erlang - 你能溢出一个 Erlang 进程的消息队列吗?

转载 作者:行者123 更新时间:2023-12-01 02:13:09 26 4
gpt4 key购买 nike

我还在学习 Erlang,所以我可能是错的,但这就是我理解进程消息队列的方式。

一个进程可能在它的主接收循环中,接收某些类型的消息,而稍后它可能被置于等待循环中以处理第二个循环中的不同类型的消息。如果进程会在第二个循环中接收到第一个循环的消息,它只会将它们放入队列中,暂时忽略它们,只处理它在当前循环中可以匹配的那些消息。 现在如果它再次进入第一个接收循环,它将从头开始并再次处理它可以匹配的消息。

现在我的问题是,如果这就是 Erlang 的工作方式并且我正确理解了这一点,那么当恶意进程发送一堆进程永远不会处理的消息时会发生什么。队列最终是否会溢出,导致进程崩溃,或者我应该如何处理?我将打出一个例子来说明我的意思。

现在,如果一个恶意程序会获得 Pid 并会转到 Pid ! {malicioudata, LotsOfData}重复,这些消息是否会被过滤掉,因为它们永远不会被处理,或者它们只是堆积在队列中?

startproc() -> firstloop(InitValues).

firstloop(Values) ->
receive
retrieveinformation ->
WaitingList=askforinformation(),
retrieveloop(WaitingList);
dostuff ->
NewValues=doingstuff(),
firstloop(NewValues);
sendmeyourdata ->
sendingdata(Values),
firstloop(Values)
end.

retrieveloop([],Values) -> firstloop(Values).
retrieveloop(WaitingList,Values) ->
receive
{hereismyinformation,Id,MyInfo} ->
NewValues=dosomethingwithinfo(Id,MyInfo),
retrieveloop(lists:remove(Id,1,WaitingList),NewValues);
end.

最佳答案

消息数量没有硬性限制,也没有固定的内存量限制,但是如果您有数十亿条消息(或者一些 super 大的消息,也许),您肯定会耗尽内存。

早在你 OOM 因为一个巨大的邮箱你会注意到 selective receives taking a long time (并不是说“选择性接收”是大部分时间遵循的好模式...)或者天真地偷看进程邮件队列和realized you've opened Pandora's Box in your terminal .

这通常被视为 Erlang 世界中的节流和监控问题。如果您无法跟上并且您的问题是可并行化的,那么您需要更多的 worker 。如果您要最大限度地利用硬件,那么您需要更高的效率。如果您仍在最大限度地利用您的硬件,无法获得更多,并且您仍然不知所措,那么您需要决定如何实现推回或减载。

关于erlang - 你能溢出一个 Erlang 进程的消息队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27525893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com