Jeśli rozumiem, model aktora jest podobny do modelu obiektowego, ale z kilkoma różnicami:
- KAŻDY obiekt spawnuje swój własny wątek i nie stanowi problemu, nawet jeśli masz tysiące obiektów.
- Aktorzy nie wchodzą w interakcje, wywołując funkcje i zwracając wartości, ale zamiast tego wysyłając i odbierając wiadomości.
- Jeśli nie naruszysz tego modelu, Twoja aplikacja będzie korzystała z pełnej współbieżności bez ryzyka warunków wyścigowych.
- Wszystko, co możesz zrobić w OO, możesz zrobić z aktorami, ale lepiej, problem polega na tym, że wszystko, co zakodowaliśmy w ostatnich latach, było oparte na OO - ale przejście jest nieuchronne.
Załóżmy na przykład, że muszę zdefiniować klasę / aktora wektora 3d, utworzyć dwie instancje i wywołać na nich operację sumowania.
OBIEKT ZORIENTOWANY:
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
MODEL AKTORA:
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
}
Czy to to? Czy też całkowicie się mylę?