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
与反应式编程几乎没有关系,除了它的行为在多线程环境中有明确的定义。
到目前为止,我已经意识到 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
与反应式编程几乎没有关系,除了它的行为在多线程环境中有明确的定义。