2010-02-23 149 views
4

調用!!方法從一個演員到另一個演員似乎仍然保持頻道打開,即使在主叫方收到答覆後(即:未來已準備就緒)。斯卡拉2.8Beta1演員

例如,使用!!從一個演員向另一個演員發送11個不同的消息將導致在原始調用者的郵箱中顯示與以下類似的11個消息,每個消息具有不同的Channel @ xxxx值。

!(scala.actors.Channel @ 11b456f,退出(com.test.app.actor.QueryActor @ 4f7bc2,「正常))

是這些消息來自工人正在等待答覆,原來的調用者在它自己調用exit()時發送Exit消息,或者它們是否在另一端生成,並且出於某種原因,具有上面顯示的打印形式?此時,工人演員已經退出,所以原來的主叫人!!絕對不會收到任何回覆。

這種行爲是不可取的,因爲原始調用actor的郵箱會填充這些退出消息(每次使用時爲每個通道創建一個)。

如何停止?原始來電者是否自動「鏈接」到每個頻道上創建的回覆頻道!呼叫?

回答

5

這些退出消息發送給原來的主叫方的原因是主叫方將其用於接收未來結果的臨時信道鏈接到被叫方。特別是,如果頻道收到退出信號,則會在該頻道上發送退出消息,這會導致類似於您所描述的發送給實際呼叫者的消息(您可以將頻道視爲消息上的標籤)。如果被調用者在提供未來消息發送之前終止(在訪問未來時拋出異常),則這樣做是爲了允許(重新)在調用者內部拋出異常。

當前實現的問題是,即使未來已解決,調用方也會收到退出消息。這顯然是一個應該在Scala Trac上提交的錯誤。如果未來還沒有解決,可能的解決方法是僅發送退出消息。在這種情況下,只要使用apply或isSet第一次訪問未來,就會刪除Exit消息。

+1

看起來像未來創建時,它鏈接到將提供價值的演員。當值被設置時,我認爲它需要取消鏈接。這將阻止所有這些消息。此外,鏈接列表中的內容本質上是內存泄漏。 – 2010-02-24 13:24:53

+1

Scala門票由Engbrecht先生製作 https://lampsvn.epfl.ch/trac/scala/ticket/3102 – 2010-02-24 15:04:29

+0

@scaling_out Philipp現已關閉勾號。它應該在每晚的Scala主幹上或下一個Scala測試版上可用。 – 2010-03-08 19:58:03