Scala 如何设法避免响应式编程中的竞争?

How does Scala manage to avoid racing in reactive programming?

到目前为止,我已经意识到 Scala 中函数式反应式编程的基本思想是定义一个扩展 Scala 的 DynamicVariable class 的信号,但我无法理解写在class 的解释是:

DynamicVariables provide a binding mechanism where the current value is found through dynamic scope, but where access to the variable itself is resolved through static scope.

如果我没记错的话,动态作用域是指被调用函数从调用程序的作用域中看到一个变量,而静态作用域是从它自己的作用域中看到一个变量,就像下面的伪代码一样:

    let x = 1
    func dynamic (y: Int) = y + x
    func static (w: Int) = y + x
    func main() = {
        let x = 2  
        dynamic (3)  //returns 5
        static (3)   //returns 4
    }

所以问题是访问变量本身的意义是什么,如果它意味着写入它,Scala 如何在某些函数各有一个副本并想要写入变量时防止竞争?

在下文中,dv1 以正常方式定义,并且只能通过通常的范围规则访问。函数 checkDv1 看到 dv1 因为 dv1 是在其范围内定义的。

val dv1: DynamicVariable[Int] = new DynamicVariable(42)

def checkDv1 = println( dv1.value )

然而,当在 withValue() 动态范围内调用 checkDv1 时,它返回的值是不同的,因为它将是新绑定的值。

def testDv = dv1.withValue(41) {
  checkDv1
}

checkDv1
testDv
checkDv1

所以,这三个函数调用的输出应该是:

42
41
42

随着动态范围的变化。

对于您的其他问题,DynamicVariable 在线程的上下文中具有绑定。当一个新线程被创建时,当前的绑定被复制到新线程中,并且它们之间没有进一步的交互。因此,没有竞争条件。

DynamicVariable 与反应式编程几乎没有关系,除了它的行为在多线程环境中有明确的定义。