要以 PDF 格式阅读本主题,请点击此处

CSP

顺序进程通信 (**CSP**) 提供了一种正式的并发模型,该模型由同步通信的独立进程组成。

该模型提供确定性行为,并且允许开发人员将进程组合成可组合和可重用的组件。

进程,在 **GPars** 中称为 *任务*,是并发运行的独立活动,它们通过(通常是同步的)通道发送数据进行通信。

这里是一个并发实现的埃拉托斯特尼筛法

CSP 示例 - 埃拉托斯特尼筛法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
inal int requestedPrimeNumberCount = 1000
final DataflowQueue initialChannel = new DataflowQueue()
/**
 * Generating candidate numbers
 */
group.task {
    (2..10000).each {
        initialChannel << it
    }
    initialChannel << -1  //poisson
}

/**
 * Chain a new filter for a particular prime number to the end of the Sieve
 * @param inChannel The current end channel to consume
 * @param prime The prime number to divide future prime candidates with
 * @return A new channel ending the whole chain
 */
def filter(inChannel, int prime) {
    def outChannel = new DataflowQueue()

    group.task {
        while (true) {
            def number = inChannel.val
            if (number % prime != 0) {
                outChannel << number
            }
            if (number == -1) break  //handle poisson and stop
        }
    }
    return outChannel
}

/**
 * Consume Sieve output and add additional filters for all found primes
 */
def currentOutput = initialChannel
requestedPrimeNumberCount.times {
    int prime = currentOutput.val
    println "Found: $prime"
    currentOutput = filter(currentOutput, prime)
}

**GPars** 任务代表主动计算。通过通道进行间接寻址使您在如何以及何时将任务连接在一起方面具有极大的灵活性。*Promise* 的概念允许任务以线程安全的方式轻松地向程序的其他部分发出事件或值信号。CSP 程序具有高度确定性,这对于并发程序来说是一个非常有用的特性。

任务可以轻松地与其他 **GPars** 概念结合使用 - 与 *Agent* 结合使用以简化共享状态管理,或者与 *Dataflow Operators* 结合使用以处理流式数据。

有关更多详细信息,请参阅 本用户指南的 Groovy CSP 部分