Concurrency 理解代码执行并发模式:菊花链
我在研究Go并发模式 我不确定的一种模式是:菊花链 我很难理解代码的控制流 有人能给我解释一下吗Concurrency 理解代码执行并发模式:菊花链,concurrency,go,Concurrency,Go,我在研究Go并发模式 我不确定的一种模式是:菊花链 我很难理解代码的控制流 有人能给我解释一下吗 package main import ( "fmt" ) func f(left, right chan int) { left <- 1 + <-right } func main() { const n = 10000 leftmost := make(chan int) right := leftmost
package main
import (
"fmt"
)
func f(left, right chan int) {
left <- 1 + <-right
}
func main() {
const n = 10000
leftmost := make(chan int)
right := leftmost //point B: what does these do ?
left := leftmost
for i := 0; i < n; i++ {
right = make(chan int)
go f(left, right)
left = right //point A
}
go func(c chan int) { c <- 1 }(right)
fmt.Println(<-leftmost)
}
主程序包
进口(
“fmt”
)
函数f(左、右循环整数){
左它说明您可以生成大量goroutine
这里,每个go f(左、右)
块:leftVonC已经给出了一个直接的答案。下面是一些进一步的说明
这里有一个稍微整理过的版本,不同之处在于作为参数传递的通道有明确指定的方向,即,我不确定A点和B点中的代码。这些语法真的让我困惑。你介意解释一下吗?我喜欢数组方法。+1是的,它很容易理解,但很好要知道数组不是严格必需的(根据原始程序),这样可以节省一些内存。内存不足比代码清晰更重要吗?(始终是一个有用的问题-没有始终正确的答案)您的版本看起来不错。您应该将其作为答案发布。
var right chan int
left <- (new) right (now left) <- (new) right (now left) <- ...
package main
import (
"fmt"
)
func f(left chan<- int, right <-chan int) {
left <- 1 + <-right
}
func main() {
const n = 10000
// first we construct an array of n+1 channels each being a 'chan int'
var channels [n+1]chan int
for i := range channels {
channels[i] = make(chan int)
}
// now we wire n goroutines in a chain
for i := 0; i < n; i++ {
go f(channels[i], channels[i+1])
}
// insert a value into the right-hand end
go func(c chan<- int) { c <- 1 }(channels[n])
// pick up the value emerging from the left-hand end
fmt.Println(<-channels[0])
}