2013-01-24 37 views
0

我知道這是不建議在演員的receive方法來阻止,但我相信這是可以做到(只要它沒有太多的演員在做一次)。何時可以安全阻止Akka 2演員?

This post建議阻止在preStart作爲解決問題的一種方法,所以推測在preStart阻止是安全的。

但是,我試圖阻止在preRestart(而不是preStart),一切似乎只是掛起 - 沒有更多的消息被記錄爲收到。

而且,在它是不是安全阻擋的情況下,什麼是一個安全的選擇?

回答

1

這是比較安全的receive阻止時:

  1. 的總阻塞演員的數量大於總工作線程的數量少得多。默認情況下,有10個工作線程,所以1-2受阻演員都很好

  2. 阻擋演員都有自己的專用調度程序(線程池)。其他演員不受影響

當它是不安全的阻止,好的選擇是...不阻止;-)。如果您正在使用固有阻塞的遺留API,則可以在某個actor內部維護一個單獨的線程池(感覺不對)或使用上述方法2.將少量線程專用於需要阻止的actor的子集。

+0

這是一個很好的解釋。我認爲主要的一點是阻塞使用了一個線程。阻塞過多會減慢程序的速度。您應該始終嘗試使用非阻塞操作。 –

1

永遠不要阻止演員。

如果你的演員是一個演員層次結構的一部分(應該是),演員系統無法阻止它。 演員的生命週期(監督,守望等)通過消息傳遞完成。 停止阻止孩子的父母演員將無法工作。

也許有辦法夫婦與演員的生命週期中的阻塞情況。 但是這會導致併發症和不良風格的超載。

所以,最好的辦法是做演員之外的阻擋部分。 例如您可以通過獨立線程中的執行程序服務運行阻止代碼。

+0

嗯,它會在阻塞操作完成時成功或失敗。顯然,如果它永遠阻擋,會有問題。這是我在原來的情況下遇到的那種問題。 –

+0

如果您阻止演員數秒,您的演員將無響應。重新啓動或應用程序關閉將凍結那段時間。這對於容錯的想法是相反的。 – Latrine

+0

我實際上希望我的應用程序關閉被阻塞,以便磁盤上的持久狀態可以跟上內存中的內容。 –