275_尚硅谷_管道阻塞的机制

1.应用实例2 --- 阻塞1.应用实例2 --- 阻塞

2.应用实例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阻塞:只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来_代码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阻塞:只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来_运行结果4.实例3阻塞:只要有写入有读取,不会关注读写时间是否一致,最终都会读取出来_运行结果

posted on 2026-03-05 13:58  与太阳肩并肩  阅读(0)  评论(0)    收藏  举报

导航