2

一部のアクターをキューであるかのように扱うことに関して何らかの制限があるプログラムでアクターを使用したいと思います。たとえば、変更イベントが適用される外部システムと、外部システムのデータのキャッシュがあるとします。だから私は2人の俳優を持っています:

  1. ChangeApplicationActor
  2. CacheActor

の一部として、外部システムのChangeApplicationActorエンティティに変更を適用するときに、イベントを送信して に同期Xするよう伝えたいと考えています。CacheActor

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

しかし、私には2つの要件があります。

  1. には内部状態があり、理想的にはその命令を順番CacheActorに処理したいSync
  2. の同じ値に対するCacheActor2 つの命令を含む の受信トレイになってしまった場合、2 番目の命令は無視したいと思います (つまり、 の任意の値に対して保留中の命令は 1 つだけにする必要があります) 。Sync(x)xSyncx

アクターを強制的にシングルスレッドにする方法はありますか? アクターのメールボックスにアクセスして、重複したイベントを削除する方法はありますか? CacheActoras, um, not an Actorの実装を避けることはできませんか?

4

1 に答える 1

5

アクターは一度に 1 つのスレッドでのみ実行されることが保証されており、アクターのメールボックス内のメッセージは FIFO 順であるため、#1 が存在します。

2 は組み込みのサポートがないため、よりトリッキーです。アクターには「メールボックス」という属性があります。receive または react を介する代わりに、メールボックスに直接アクセスできます。メッセージの処理が完了する前に、一致する Sync メッセージをメールボックスから呼び出すだけです。これを行う場合、メッセージの送信中に別のスレッドがメールボックスにアイテムを追加しようとするのを防ぐために、アクターで同期する必要があります。

アクターで同期すると、ライブラリによって保証されるデッドロックの自由度がなくなり、スケーラビリティが低下することに注意してください。しかし、実用的な観点からは、おそらく大丈夫でしょう。

于 2009-06-17T11:39:15.047 に答える