275_尚硅谷_管道阻塞的机制
1.应用实例2 --- 阻塞
2.应用实例2 --- 阻塞代码,只写不读
package main
import (
"fmt"
"time"
)
// * 2. 开启一个writeData 协程, 向管道 intChan 写入50个整数
func writeData(intChan chan int) {
for i := 1; i <= 50; i++ {
// * 2.1 放入数据,
// ? 该位置发生阻塞,死锁
intChan <- i
fmt.Println("writeData= ", i)
// ! 输出穿插交互,需要写停滞1秒
time.Sleep(time.Second)
}
// * 2.2 放入数据结束后,关闭管道,关闭管道后,可以在readData函数中使用for_range读取
close(intChan)
}
// * 3. 开启一个readData 协程, 从管道intChan中读取 writeData 写入的数据
func readData(intChan chan int, exitChan chan bool) {
for {
v, ok := <-intChan
if !ok {
break
}
// ! 输出穿插交互,需要写停滞1秒
time.Sleep(time.Second)
fmt.Printf("readData 读到数据= %v\n", v)
}
// * 3.1 readData 读取完数据后, 即任务完成
exitChan <- true
close(exitChan)
}
func main() {
// * 1. 创建两个管道
intChan := make(chan int, 10)
exitChan := make(chan bool, 1)
// * 4. 创建两个协程
go writeData(intChan)
// ? 阻塞: 只写不读,
// go readData(intChan, exitChan)
// ! 测试1:
// time.Sleep(time.Second * 10)
// ! 测试2:
for {
_, ok := <-exitChan
if !ok {
break
}
}
}
3.实例3阻塞:只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来_代码
package main
import (
"fmt"
"time"
)
// * 2. 开启一个writeData 协程, 向管道 intChan 写入50个整数
func writeData(intChan chan int) {
for i := 1; i <= 50; i++ {
// * 2.1 放入数据,
// ? 该位置发生阻塞,死锁
intChan <- i
fmt.Println("writeData= ", i)
// ? 写的很快,不做间隔时间
// time.Sleep(time.Second)
}
// * 2.2 放入数据结束后,关闭管道,关闭管道后,可以在readData函数中使用for_range读取
close(intChan)
}
// * 3. 开启一个readData 协程, 从管道intChan中读取 writeData 写入的数据
func readData(intChan chan int, exitChan chan bool) {
for {
v, ok := <-intChan
if !ok {
break
}
// ! 输出穿插交互,需要写停滞1秒,
// ? 读的比写的速度慢不会造成阻塞情况
time.Sleep(time.Second)
fmt.Printf("readData 读到数据= %v\n", v)
}
// * 3.1 readData 读取完数据后, 即任务完成
exitChan <- true
close(exitChan)
}
func main() {
// * 1. 创建两个管道
intChan := make(chan int, 10)
exitChan := make(chan bool, 1)
// * 4. 创建两个协程
go writeData(intChan)
// ? 总结: 只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来
go readData(intChan, exitChan)
// ! 测试1:
// time.Sleep(time.Second * 10)
// ! 测试2:
for {
_, ok := <-exitChan
if !ok {
break
}
}
}
4.实例3阻塞:只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来_运行结果
浙公网安备 33010602011771号