私が理解した場合、アクターモデルはオブジェクトモデルに似ていますが、いくつかの違いがあります。
- すべてのオブジェクトはそれ自身の独立したスレッドを生成し、数千のオブジェクトがある場合でも問題はありません。
- アクターは、関数を呼び出して戻り値を取得することによって対話するのではなく、メッセージを送受信することによって対話します。
- そのモデルに違反しない場合、アプリは競合状態のリスクなしに、最大限の同時実行を使用します。
- オブジェクト指向でできることはすべて、アクターを使用して行うことができますが、問題は、ここ数年でコーディングしたすべてがオブジェクト指向に基づいていたということです-しかし、移行は差し迫っています。
したがって、たとえば、3Dベクトルクラス/アクターを定義し、2つのインスタンスを作成し、それらの和演算を呼び出す必要があるとします。
オブジェクト指向:
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
}
それですか?または私は完全に間違っていますか?