我想使用scala actors來並行化代碼。這是我第一次與演員合作的真實代碼,但我在C中使用Java Mulithreading和MPI方面有一些經驗。但是我完全失去了。scala actors之間的依賴關係
欲實現的工作流是一個圓形的管道,並且可以描述爲以下:
- 每個工人演員具有到另一個基準,從而形成了一圈
- 有一個協調演員,其可以通過發送消息
StartWork()
- 當工人接收
StartWork()
消息觸發的計算,它在本地處理的一些東西,併發送DoWork(...)
MESSA ge給它在圈子裏的鄰居。 - 鄰居做了一些其他的東西,併發送一個
DoWork(...)
消息到自己的鄰居。 - 這一直持續到最初的工作人員收到
DoWork()
消息。 - 協調員可以發送一個
GetResult()
消息給初始worker並等待回覆。
問題是協調器應該只在數據準備就緒時收到結果。 工作人員在回覆GetResult()
消息之前如何等待作業返回?
爲了加速計算,任何員工可以隨時收到StartWork()
。
這是我第一次嘗試僞實現工人:
class Worker(neighbor: Worker, numWorkers: Int) {
var ready = Foo()
def act() {
case StartWork() => {
val someData = doStuff()
neighbor ! DoWork(someData, numWorkers-1)
}
case DoWork(resultData, remaining) => if(remaining == 0) {
ready = resultData
} else {
val someOtherData = doOtherStuff(resultData)
neighbor ! DoWork(someOtherData, remaining-1)
}
case GetResult() => reply(ready)
}
}
在協調方面:
worker ! StartWork()
val result = worker !? GetResult() // should wait
謝謝你的回答。我會盡快嘗試。順便說一句,我認爲,如果在'=>'之後在這種情況下是正確的。在匹配參數時,我不會尋找警衛,但我希望根據價值有兩種不同的行爲。也許我應該使用兩個不同的警衛的「案例」條目。 – paradigmatic
哦,是的。所以是 - 我正在讀'=>'在其他地方 –