Если я понял, модель актера похожа на объектную модель, но с некоторыми отличиями:
- КАЖДЫЙ объект порождает свой отдельный поток, и это не проблема, даже если у вас есть тысячи объектов.
- Актеры взаимодействуют не с помощью вызова функций и получения возвращаемых значений, а с помощью отправки и получения сообщений.
- Если вы не нарушите эту модель, ваше приложение будет использовать параллелизм на полную мощность без каких-либо рисков гоночных условий.
- Все, что вы можете сделать в ОО, вы можете сделать, используя актеров, но лучше, проблема в том, что все, что мы кодировали в последние годы, было основано на ОО - но переход неизбежен.
Например, предположим, что мне нужно определить класс / вектор трехмерного вектора, создать два экземпляра и вызвать для них операцию суммирования.
ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ:
class V3d {
constructor V3d(x,y,z) //bla
float x,y,z;
function sum(V3d b)
{
return V3d(x+b.x,y+b.y,z+b.z);
}
}
//using:
mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly
drawPoint(mySum) //uses the result
МОДЕЛЬ АКТЕРА:
actor V3d
{
constructor V3d(x,y,z) //bla
float x,y,z;
loop
{
receive 'sum',b:V3d :
send(caller,'sumResult',V3d(x+b.x,y+b.y,z+b.z))
}
}
//using:
send(V3d(1,2,3),'sum',V3d(3,2,1)) //creates 2 instances, send to the first one a request to sum with the second one
loop
{
receive 'sumResult',result:
drawPoint(result) //receives result and draws it
}
Это оно? Или я совершенно не прав?