2011-09-02 76 views
6

未讀收件箱中的郵件斯卡拉演員?例如兩種情況:

1.如果忘記實現反應情況特殊消息:

actor!NoReactCaseMessage

2.如果消息來的太快:

(timeOfProcessingMessage > timeOfMessageComes)

如果第一或第二的情況下發生的,將它疊記憶?斯卡拉,演員,未讀的收件箱郵件會發生什麼?

編輯1是否有任何機制看到這種類型的內存泄漏發生?也許,控制未讀郵件的數量,然後做一些垃圾收集或增加演員池。如何獲取未讀郵件的數量?其他語言如何解決這種內存泄漏問題?例如在Erlang

回答

8

郵箱是一個隊列 - 如果不從隊列中拉出消息(即,如果在你的reactreceive環路部分函數返回falseisDefinedAt),那麼這些消息只是呆在那裏。

嚴格地說,這是一個內存泄漏(你的應用程序),雖然它的嚴重性取決於這些未讀消息如何在數量上增長(顯然)。例如,我經常使用演員合併重播查詢和由序列號標識的消息的「實時流」。我的反應是這樣的:

var lastSeq = 0L 
loop { 
    react { 
    case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data) 
    } 
} 

這包含了內存泄漏,但不是一個「嚴肅」的一個,因爲會有重複的郵件數量的上限(即不可能有更多的一次重播查詢完成)。

但是,這可能仍然是一個煩惱,對於每個反應,參與者子系統將再次掃描這些消息以查看它們是否可以被處理。

事實上,考慮一個真實郵箱可能是一個很好的比喻。想象一下,你將所有的垃圾郵件留在那裏:很快,你會因爲所有的垃圾郵件而遭受飢餓,因爲你需要篩選所有垃圾郵件才能獲得信用卡帳單。

3

這種內存泄漏如何解決其他語言?例如在Erlang中?

和Scala一樣。第一個問題:

  1. 如果忘記實現反應情況特殊消息

你很少需要在郵箱中留言故意後來接受它。我從未遇到過這種情況。所以你總是可以包含一個catch-all子句(Scala中的case _ => ...),它不會做任何事情,記錄警告或拋出異常 - 在你的情況下最有意義的事情。

  1. 如果消息來自太快

,而不是直接將消息發送到無法處理它們足夠快的過程中,添加一個緩衝的過程。它可以丟棄額外的消息,將它們發送給多個工作進程等。