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