2

ActorControl、ActorA、ActorBの3つのアクターが相互に通信しているとします。

ActorAとActorBはActorControlと通信します。受信するメッセージはほとんど異なりますが、同じメッセージXも1つあります。Xを取得すると、両方とも機能Yを実行する必要があります。

重複コードを避けるために、関数Yを取り出してcommonというオブジェクトをパッケージ化しました。

この場合、ActorAとActorBの両方がまったく同時にcommon.Yを呼び出す可能性があります。

私の質問は、この方法でアクターの並行性を妨害するかどうかです。

4

1 に答える 1

4

アクター間でコードを共有することはできますが、データを共有することはできません。関数が純粋な場合(ステートレスで副作用がない場合)、問題はまったくありません。

ここではいくつかの例を示します。

object Helper {

  // Safe
  def incrementPure( total: Int, i: Int ) = total + i

  //Unsafe
  private var total = 0
  def incrementStateful( i: Int ) = { total += i; total }

  //Unsafe
  def incrementSideEffect( i: Int ) = {
    val total = readCurrentTotal()
    val total2 = total + i
    saveCurrentTotal( total2 )
    total2
  }

}

最後の2つの関数では、ある種の同期を提供する必要があります。ただし、並列処理に依存している場合、これはパフォーマンスに影響を与える可能性があります。

于 2013-03-24T10:11:09.430 に答える