我目前正在研究Tour of Go,我认为goroutines的使用方式与Python生成器类似,特别是问题66.我认为66看起来很复杂,所以我把它重写为:
package main
import "fmt"
func fibonacci(c chan int) {
x, y := 1, 1
for {
c <- x
x, y = y, x + y
}
}
func main() {
c := make(chan int)
go fibonacci(c)
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效.几个问题:
fibonacci将尽快填满10个其他位置,并尽可能快地main消耗掉这些位置.这是正确的吗?这会比以1的缓冲区大小更高的性能而牺牲内存,对吗?fibonacci发送者关闭,当我们离开这里的范围时会发生什么?我的期望是,一旦c和go fibonacci超出范围,渠道和它的一切得到垃圾收集.我的直觉告诉我这可能不会发生什么.在查看一些golang代码时,我发现了以下内容:
ch := make(chan int)
Run Code Online (Sandbox Code Playgroud)
我在golang Chanels的在线教程中查了解:
https://tour.golang.org/concurrency/2
但我觉得这个例子不清楚.
有人可以给我一个简单的解释和使用频道的例子吗?
如果我正确使用频道,我是否需要使用互斥锁来防止并发访问?
Go 通道可用于在 goroutine 之间进行通信。类似地,yield 和 next 语法可用于在两个生成器之间进行通信。我的假设正确吗?如果不是,我哪里错了?
go ×4
channel ×2
generator ×2
goroutine ×2
concurrency ×1
javascript ×1
mutex ×1
node.js ×1
python ×1