我對GPars演員的理解可能會關閉,所以如果我錯了,請糾正我。我有一個Groovy應用程序來輪詢Web服務的工作。當找到一個或多個作業時,它會將每個作業發送到我創建的DynamicDispatchActor
,並處理作業。作業是完全獨立的,不需要將任何東西返回到主線程。當一次有多個工作進來時,我希望他們能夠並行處理,但無論我嘗試什麼配置,都需要首先進行處理。我該如何平行GPars Actors?
爲了給出一個代碼示例:
def poolGroup = new DefaultPGroup(new DefaultPool(true, 5))
def actor = poolGroup.messageHandler {
when {Integer msg ->
println("I'm number ${msg} on thread ${Thread.currentThread().name}")
Thread.sleep(1000)
}
}
def integers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
integers.each {
actor << it
}
此打印出:
I'm number 1 on thread Actor Thread 31 I'm number 2 on thread Actor Thread 31 I'm number 3 on thread Actor Thread 31 I'm number 4 on thread Actor Thread 31 I'm number 5 on thread Actor Thread 31 I'm number 6 on thread Actor Thread 31 I'm number 7 on thread Actor Thread 31 I'm number 8 on thread Actor Thread 31 I'm number 9 on thread Actor Thread 31 I'm number 10 on thread Actor Thread 31
隨着每個打印出之間的輕微的暫停。另請注意,每個打印輸出都來自同一個Actor /線程。
我想在這裏看到的是前5個數字會立即打印出來,因爲線程池被設置爲5,然後接下來的5個數字會被釋放。我完全離開這裏嗎?
所以我想我明白你在做什麼,但是如果我們必須每次都創造一個無國籍的演員,那麼這似乎無法擊敗使用無國籍演員的目的? 你會建議也許找到一種替代方法來解決這個問題? – 2014-12-08 14:32:07
嘿帕特里克,感謝您的評論!我已經用不同方法的例子更新了答案,可能更適合您的需求。 – 2014-12-08 15:46:09