假设我有三个 Actor 相互通信:ActorControl、ActorA、ActorB。
ActorA 和 ActorB 与 ActorControl 通信。他们收到的消息大多不同,但他们也有一个相同的消息 X。当他们得到 X 时,他们都需要执行功能 Y。
为了避免重复代码,我取出函数 Y 来打包名为 common 的对象。
在这种情况下,ActorA 和 ActorB 可能同时调用 common.Y。
我的问题是这种方式是否破坏了演员的并发性?
您可以跨参与者共享代码,但不能共享数据。如果您的函数是纯函数(无状态且没有副作用),则根本没有问题。
这里有些例子:
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
}
}
在最后两个函数中,您应该提供某种同步。但是,如果您依赖并行性,这可能会影响性能。