web-dev-qa-db-ja.com

アクターはスレッドと比較してどのように機能しますか?

Actorsがスレッドと比較してどのように機能するかについて、適切で短い説明はありますか?

スレッドをアクターと見なして、他のスレッドにメッセージを送信することはできませんか?多少の違いはありますが、はっきりしていません。スレッドを異なる方法で使用することで、どの言語でもActorsを使用できますか?

85
Jonas

アクターモデルはメッセージパッシングで動作します。個々のプロセス(アクター)は、互いに非同期でメッセージを送信できます。これを通常スレッドモデルと考えるものと区別するものは、(少なくとも理論的には)共有状態がないことです。そして、(正当なことに、私は)共有状態がすべての悪の根源であると信じるなら、俳優モデルは非常に魅力的になります。

ただし、興奮する必要はありません。アクターモデルは(いくつかの申し立てに反して)デッドロックを持つことを不可能にしません。また、アクターモデルは、メッセージキューなどの異なるプロセス間でリソースの競合を防ぐことはできません。モデルは、特定のレベルを超えると「ロックフリー」になります。下位レベルでは、メッセージキューを調整するために、ロックが必要です。

スレッドをアクターとみなして他のスレッドにメッセージを送信することはできませんか?

はい、そうです。いいえ、共有メモリの場所の周りにミューテックスを配置するアプローチを使用している場合。次に、スレッドはこの状態を共有します-両方がこのメモリにアクセスし、読み取り、再書き込みなどを行うことができます。しかし、スレッドモデルの上にアクターモデルを構築でき、実際にすべてのアクター実装にはスレッドがあります。下に。ミューテックスで保護されたキューを各スレッドに与えることで、(非常にひどく)このようなものを一緒にハックしました-ただの楽しみのために。アクタースレッドインピーダンスがどのように管理されるかについては、 1年前の私の質問 を参照してください。

スレッドを異なる方法で使用することにより、任意の言語でアクターモデルを使用できますか?

はい、しかしもう少し手間がかかります。お気に入りの言語にはメッセージパッシングライブラリが含まれている可能性があるため、最初に調査する必要があります。また、不変データ構造の使用を調査する必要があります。データ構造が不変である場合、本質的に「共有状態」の問題に対処していることに注意してください。複数のスレッドが、何も悪いことなく不変データへの参照を保持できます。アクター言語が関数型言語(erlang、scala)でもある傾向があるのには理由があります。

また、異なるが魅力的なモデルであるソフトウェアトランザクションメモリを確認することもできます。 Clojureは私のお気に入りの例です。

74
Rob Lachlan

アクターが常に非同期でメッセージを渡すとは言いません。遅すぎるでしょう。適切な例として、JActorプロジェクトはメソッド呼び出しをより適切にモデル化するために双方向メッセージ(要求/応答)を使用します。そして、ほとんどのリクエストは同期的に処理されます。

JActor(a Java library)もロックを使用しません。いくつかのセマフォが投入されたアトミックおよび同時データ構造のみです。メッセージの受け渡しは毎秒約80億メッセージです。

https://github.com/laforge49/JActor

2
Bill la Forge