2009-10-24 115 views
15

我可以在Scala中爲演員的郵箱設置最大大小嗎?scala郵箱大小限制

以生產者 - 消費者問題。有了線程,我可以在緩衝區填滿時阻止生產者。我看到了一些用Scala編寫的生產者 - 消費者示例,他們都使用帶有用作「緩衝區」的郵箱的actor。我可以設置郵箱大小,讓生產者等待消費者準備好嗎?任何其他優雅的解決方案,以避免無法控制的郵箱增長?

回答

16

您可以創建一個充當生產者和消費者之間緩衝區的角色。緩衝區檢出其郵箱到它的循環數據。當緩衝產品的數量太高時,它向生產者發送「過載」消息;並且一旦所有事情都恢復順序,就發送一個「清除」消息。如果消息太多,它只會丟棄傳入的消息(或最老的消息)。

消費者主動向緩衝區請求產品,然後緩衝區發送一個產品。如果緩衝區爲空,則消費者會一直等待輸入。

生產者將產品發送給緩衝角色。如果它收到「超載」消息,它可以停止生產,或者它可以繼續生產,因爲知道產品可能會被丟棄。

當然這個邏輯可以直接實現到生產者或消費者本身,但是一個單獨的緩衝區將允許你更容易地引入多個生產者和/或消費者。

5

Actor.mailboxSize方法返回Actor中郵箱中未決郵件的數量。

這可用於以各種方式限制生產者。

例如,一種可能性是,

生產者檢查消費者的mailboxSize是大於某一閾值。如果是,則它向消費者發送SpecialMessage,並阻塞信號量。當消費者收到這個SpecialMessage它釋放信號量。生產者現在可以愉快地繼續它的業務。

這可以避免輪詢以及任何丟棄的消息。

+1

投票似乎比讓消費者的郵箱成爲兩個參與者之間的「共享狀態」更合適。 – Zed 2009-10-25 11:38:01

+1

從純粹的編程角度來看,輪詢通常更好,但從硬件利用角度來看,信號通常更好。取決於你應該選擇哪一種確切的情況。 – 2009-10-26 19:11:53

+0

@Zed消費者的郵箱是共享狀態!否則製作人將無法發送任何消息給它:) – HRJ 2009-10-27 01:45:26