【发布时间】:2010-03-17 17:46:04
【问题描述】:
我正在尝试使用 scala 演员并行化代码。这是我的第一个真正的演员代码,但我在 C 中使用 Java 多线程和 MPI 有一些经验。但是我完全迷路了。
我要实现的工作流是一个循环流水线,可以这样描述:
- 每个workeractor 都有对另一个actor 的引用,从而形成一个圆圈
- 有一个 coordinator actor 可以通过发送
StartWork()消息来触发计算 - 当worker收到
StartWork()消息时,它会在本地处理一些东西并将DoWork(...)消息发送给它在圈子中的邻居。 - 邻居做一些其他事情,然后依次向自己的邻居发送
DoWork(...)消息。 - 这种情况一直持续到初始工作人员收到
DoWork()消息。 - 协调者可以向初始工作人员发送
GetResult()消息并等待回复。
关键是协调器应该只在数据准备好时接收结果。 工人如何在回复GetResult() 消息之前等待作业返回?
为了加快计算速度,任何工作人员都可以随时收到StartWork()。
这是我第一次尝试对 worker 的伪实现:
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
【问题讨论】: