结论:如果,编译器(运行),发现一个管道;只有写,而没有读,则该管道,会阻塞。写管道和读管道的频率不一致,无所谓。
package main
import (
"fmt"
)
func writeData(intChan chan int) {
for i := 1; i <= 50; i++ {
intChan <- i
fmt.Println("writeData", i)
}
close(intChan)
}
func readData(intChan chan int, exitChan chan bool) {
for {
v, ok := <-intChan
if !ok {
break
}
fmt.Printf("read 读到的数据为%v\n", v)
}
exitChan <- true
close(exitChan)
}
func main() {
intChan := make(chan int, 10)
exitChan := make(chan bool, 1)
go writeData(intChan)
for {
_, ok := <-exitChan
if !ok {
break
}
}
}
结果会产生死锁,因为只有人存没有人取。
writeData 1
writeData 2
writeData 3
writeData 4
writeData 5
writeData 6
writeData 7
writeData 8
writeData 9
writeData 10
fatal error: all goroutines are asleep - deadlock!
如果读写的速度不一样,不会产生死锁的,因为编译器发现有人可以慢慢读取。
import (
"fmt"
"time"
)
//如果读写的速度不一样,不会产生死锁的,因为编译器发现有人可以慢慢读取。
func writeData(intChan chan int) {
for i := 1; i <= 50; i++ {
intChan <- i
fmt.Println("writeData", i)
}
close(intChan)
}
func readData(intChan chan int, exitChan chan bool) {
for {
v, ok := <-intChan
if !ok {
break
}
time.Sleep(time.Second)
fmt.Printf("read 读到的数据为%v\n", v)
}
exitChan <- true
close(exitChan)
}
func main() {
intChan := make(chan int, 10)
exitChan := make(chan bool, 1)
go writeData(intChan)
go readData(intChan, exitChan)
for {
_, ok := <-exitChan
if !ok {
break
}
}
}
结果,可以慢慢读不会死锁
writeData 1
writeData 2
writeData 3
writeData 4
writeData 5
writeData 6
writeData 7
writeData 8
writeData 9
writeData 10
writeData 11
read 读到的数据为1
writeData 12
read 读到的数据为2
writeData 13
read 读到的数据为3
writeData 14
read 读到的数据为4
writeData 15
read 读到的数据为5
writeData 16
read 读到的数据为6
writeData 17
read 读到的数据为7
writeData 18
read 读到的数据为8
writeData 19
read 读到的数据为9
writeData 20
read 读到的数据为10
writeData 21
read 读到的数据为11
writeData 22
read 读到的数据为12
writeData 23
read 读到的数据为13
writeData 24
read 读到的数据为14
writeData 25
read 读到的数据为15
writeData 26
read 读到的数据为16
writeData 27
read 读到的数据为17
writeData 28
read 读到的数据为18
writeData 29
read 读到的数据为19
writeData 30
read 读到的数据为20
writeData 31
read 读到的数据为21
writeData 32
read 读到的数据为22
writeData 33
read 读到的数据为23
writeData 34
read 读到的数据为24
writeData 35
read 读到的数据为25
writeData 36
read 读到的数据为26
writeData 37
read 读到的数据为27
writeData 38
read 读到的数据为28
writeData 39
read 读到的数据为29
writeData 40
read 读到的数据为30
writeData 41