我想使用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
哦,是的。所以是 - 我正在读'=>'在其他地方 –