スレッドと比較してアクターがどのように機能するかについての良い短い説明はありますか?
スレッドをアクターと見なして他のスレッドにメッセージを送信することはできませんか?多少の違いはありますが、はっきりしていません。スレッドを別の方法で使用して、任意の言語でアクターを使用できますか?
スレッドと比較してアクターがどのように機能するかについての良い短い説明はありますか?
スレッドをアクターと見なして他のスレッドにメッセージを送信することはできませんか?多少の違いはありますが、はっきりしていません。スレッドを別の方法で使用して、任意の言語でアクターを使用できますか?
アクターモデルはメッセージパッシングで動作します。個々のプロセス(アクター)は、相互に非同期でメッセージを送信できます。これを私たちが通常スレッドモデルと考えるものと区別するのは、(少なくとも理論的には)共有状態がないことです。そして、共有状態がすべての悪の根源であると(当然のことながら)信じるなら、アクターモデルは非常に魅力的になります。
しかし、私たちは興奮を乗り越えてはいけません。アクターモデルは(いくつかの主張に反して)デッドロックを持つことを不可能にしません。アクターモデルは、異なるプロセス間(たとえば、メッセージキュー)でリソースの競合が発生するのを防ぐこともできません。モデルは、特定のレベルを超えると「ロックフリー」になります。下位レベルでは、メッセージキューを調整するために、ロックが引き続き必要です。
スレッドをアクターと見なして他のスレッドにメッセージを送信することはできませんか?
ええ、はい、いいえ。いいえ、共有メモリの場所の周りにミューテックスを配置するアプローチを使用しているだけの場合。次に、スレッドはこの状態を共有します。どちらもこのメモリにアクセスでき、読み取り、再書き込みなどができます。ただし、スレッドモデルの上にアクターモデルを構築できます。実際、すべてのアクター実装にはスレッドがあります。下に。私は、楽しみのために、各スレッドにミューテックスによって保護されたキューを与えることによって、このようなものを(非常にひどく)一緒にハックしました。アクタースレッドのインピーダンスがどのように管理されているかを知るには、1年前の私の質問を参照してください。
スレッドを別の方法で使用して、任意の言語でアクターモデルを使用できますか?
はい。ただし、もう少し作業が必要です。あなたの好きな言語にはメッセージパッシングライブラリがあるかもしれないので、それが最初に調査することになるでしょう。また、不変のデータ構造の使用を調査する必要があります。データ構造が不変である場合は、基本的に「共有状態」の問題に対処していることに注意してください。複数のスレッドが、問題が発生することなく不変データへの参照を保持できます。アクター言語が関数型言語(erlang、scala)でもある傾向があるのには理由があります。
また、ソフトウェアトランザクショナルメモリも確認することをお勧めします。これは、異なるが説得力のあるモデルです。Clojureはその私のお気に入りの例です。
アクターが常にメッセージを非同期で渡すとは言いませんが、それは遅すぎるでしょう。適切な例として、JActorプロジェクトは双方向メッセージ(要求/応答)を使用して、メソッド呼び出しをより適切にモデル化します。また、ほとんどのリクエストは同期的に処理されます。
JActor(Javaライブラリ)もロックを使用しません。いくつかのセマフォがスローされた、一部のアトミックデータ構造と同時データ構造のみ。メッセージパッシングは、1秒あたり約0.8億メッセージです。