要以 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 撰写)

  • 无竞争条件

  • 无死锁

  • 确定性死锁

  • 完全确定性程序

  • _优美_ 代码。

听起来不错吧?

如果您想进一步了解这个有趣的概念,请查看用户指南中的数据流并发部分。