欢迎光临散文网 会员登陆 & 注册

【尚硅谷】Golang入门到实战教程丨一套精通GO语言

2023-08-19 19:12 作者:符华上仙翼玛当先  | 我要投稿

channel管道那里,可以使用waitgroup来代替exitChan ,来判断协程有没有结束,让主线程等待全部协程执行完毕。


package main

import (

"fmt"

"sync"

)


var wg sync.WaitGroup // 用于等待一组线程的结束


// 管道写入数据

func writeData(intChan chan int) {

for i := 0; i < 50; i++ {

intChan <- i

fmt.Printf("writeData 写入数据=%v\n", i)

}

close(intChan)

wg.Done() // 执行完一个线程后,调用这个方法,主线程中需要等待执行的协程数量-1

}


// 管道读取数据

func readData(intChan chan int) {

for {

v, ok := <-intChan

if !ok {

break

}

fmt.Printf("readData 读到数据=%v\n", v)

}

wg.Done() // 执行完一个线程后,调用这个方法,主线程中需要等待执行的协程数量-1

}


// 判断是否为素数

func isPrime(intChan, primeChan chan int) {

var isPrime bool // 标识是否是素数

for v := range intChan {

isPrime = true

for i := 2; i < v; i++ {

if v%i == 0 {

isPrime = false

break

}

}

if isPrime { // 如果为素数,则往primeChan中写入数据

primeChan <- v

}

}

fmt.Println("isPrime 读取素数完毕")

wg.Done() // 执行完一个协程后,调用这个方法,主线程中需要等待执行的协程数量-1

}


func main() {

协程和管道应用1()

协程和管道应用2()

}


func 协程和管道应用1() {

// 创建两个管道

intChan := make(chan int, 10)

wg.Add(2) // 说明开启了两个线程

// 开启了两个协程,writeData和readData应该是交叉执行的

go writeData(intChan) // 开启一个协程,往 intChan 中写入数据

go readData(intChan) // 开启一个协程,读取 intChan 的数据

wg.Wait() // 告诉主线程需要等待协程执行完毕

fmt.Println("程序执行完毕!")

}


func 协程和管道应用2() {

// 需求:要求统计1-8000的数字中,哪些是素数

// 将统计素数的任务,分配给4个协程去完成

intChan := make(chan int, 1000) // 读写1-8000数字的管道

primeChan := make(chan int, 2000) // 存储素数的管道

wg.Add(5) // 下面开启了5个协程

// 开启写入 1-8000 数字的协程

go func() {

for i := 1; i <= 8000; i++ {

intChan <- i

}

close(intChan)

wg.Done()

}()


// 开启4个读取 1-8000 数字,并统计素数的协程

for i := 0; i < 4; i++ {

go isPrime(intChan, primeChan)

}


wg.Wait() // 等待协程执行完毕

close(primeChan) // 关闭 primeChan 管道

// 遍历primeChan,把结果取出来

for v := range primeChan {

fmt.Printf("素数是 = %v\n", v)

}

}

【尚硅谷】Golang入门到实战教程丨一套精通GO语言的评论 (共 条)

分享到微博请遵守国家法律