要以 PDF 格式阅读本主题,请点击这里。 |
数据流
数据流并发
提供了一种替代的并发模型,它本质上是安全且健壮的。
介绍
查看使用 **Groovy** 和 **GPars** 编写的简单示例,它汇总了三个并发运行的任务执行的计算结果。
数据流示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import static groovyx.gpars.dataflow.Dataflow.task
final def x = new DataflowVariable()
final def y = new DataflowVariable()
final def z = new DataflowVariable()
task {
z << x.val + y.val
println "Result: ${z.val}"
}
task {
x << 10
}
task {
y << 5
}
回顾
我们启动三个逻辑任务,它们可以并行运行并执行其特定的活动。这些任务需要交换数据,它们通过 _数据流变量_ 来实现。将 _数据流变量_ 视为单次通道,安全可靠地将数据从生产者传输到消费者。
_数据流变量_ 具有非常简单的语义。当一个任务需要从 _DataflowVariable_ 读取值(通过 val 属性)时,它将阻塞,直到另一个任务或线程(使用 '<<' 运算符)设置该值。每个 _DataflowVariable_ 在其生命周期中只能被设置 **一次**。注意,您不必费心对任务或线程及其对共享变量的访问进行排序和同步。这些值在无需您干预的情况下,会在适当的时间神奇地传输到各个任务之间。
数据在任务/线程之间无缝流转,无需您干预或关心。
实际映射取决于调度器,但数据流算法的结果并不取决于实际调度。
优势
以下是使用数据流并发为您带来的优势(由 Jonas Boner www.jonasboner.com 撰写)
-
无竞争条件
-
无死锁
-
确定性死锁
-
完全确定性程序
-
_优美_ 代码。
听起来不错吧?
如果您想进一步了解这个有趣的概念,请查看用户指南中的数据流并发部分。