Я пытаюсь распараллелить код с использованием акторов scala. Это мой первый настоящий код с актерами, но у меня есть некоторый опыт работы с многопоточностью Java и MPI в C. Однако я полностью потерян.
Рабочий процесс, который я хочу реализовать, представляет собой круговой конвейер и может быть описан следующим образом:
- Каждый рабочий актер имеет ссылку на другого, образуя тем самым круг
- Существует координатор субъект, который может запустить вычисление, отправив
StartWork()
сообщение
- Когда рабочий получает сообщение
StartWork()
, он обрабатывает некоторые вещи локально и отправляет сообщение DoWork(...)
своему соседу по кругу.
- Соседи делают что-то еще и по очереди отправляют сообщение
DoWork(...)
своему соседу.
- Это продолжается до тех пор, пока начальный работник не получит сообщение
DoWork()
.
- Координатор может отправить
GetResult()
сообщение первоначальному работнику и ждать ответа.
Дело в том, что координатор должен получать результат только тогда, когда данные готовы. Как работник может дождаться возвращения задания, прежде чем ответить на сообщение 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