我來自Java,在那裏我將Runnable
s提交給由線程池支持的ExecutorService
。 Java中非常清楚如何設置線程池的大小限制。如何限制在Scala中使用actor時的併發性?
我有興趣使用Scala actors,但我不清楚如何限制併發。
讓我們假設,我正在創建一個接受「作業」的Web服務。作業提交POST
請求,並且我希望我的服務將作業排入隊列,然後立即返回202 Accepted
- 即作業是異步處理的。
如果我使用actors來處理隊列中的作業,如何限制同時處理的作業數量?
我可以想到幾種不同的方法來解決這個問題;我想知道是否有社區最佳實踐,或者至少是一些在Scala世界中有點標準的明確建立的方法。
我想到的一種方法是擁有一個協調員角色,該角色可以管理作業隊列和作業處理角色;我想它可以使用一個簡單的int字段來跟蹤當前正在處理的作業數量。但是,我確信這種方法會出現一些亂七八糟的情況,比如確保跟蹤錯誤發生的時間以減少數量。這就是爲什麼我想知道Scala是否已經提供了一個更簡單或更封裝的方法。
順便說一句我試着問這個問題a while ago但我問得不好。
謝謝!
非常有用,謝謝! 我不確定我會使用術語_throttle_,但無論哪種方式,有時需要約束同時「進程」的數量,因爲他們所做的工作是資源密集型的。 – 2010-02-22 21:15:10
這種方法可能不會產生所需的結果。它將允許作業排隊等待JVM耗盡內存。限制參與者可以使用的線程數量將僅限制實際並行執行的作業數量。我之前製作工作的速度超過了演員的能力,因此產生了OOM錯誤,所以你必須小心。 – 2010-02-23 01:20:51
我在想這種方法的一個缺點是它是全球性的。有時我需要運行不同級別的資源利用率的不同類型的流程 - 使用Java線程池,我可以輕鬆使用具有不同設置的不同池。對於'actors.maxPoolSize',我只能爲所有actor使用單個數字,因爲它們全部由同一個線程池支持,對吧? – 2010-02-23 02:47:43