我还在学习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.