有老师能帮忙看看我的获取素数代码哪里有问题么,我只能取到一个素数3

reckless-huang · · 666 次点击
更新后的代码如下,可以正常工作,就是感觉不够优雅 ```go package main import ( "fmt" _ "sync" ) func writeData(intChan chan int) { for i := 1; i < 80; i++ { intChan <- i } fmt.Println("writeData()执行完毕") fmt.Println("关闭intChan") close(intChan) } func judgData(intChan chan int, resultChan chan int, exitChan chan bool) { //time.Sleep(time.Millisecond *100) //fmt.Println("开始读取intChan") flag := true for { flag = true //重置标志位,因为后面这个值被设置为false了 num, ok := <-intChan if !ok { fmt.Println("数据读取完毕") break } for a := 2; a < num; a++ { if num%a == 0 { flag = false break } } if flag { resultChan <- num } } exitChan <- true fmt.Println("一个协程执行完毕") } func main() { intChan := make(chan int, 10000) resultChan := make(chan int, 10000) exitChan := make(chan bool, 8) //var wgw sync.WaitGroup //var wgr sync.WaitGroup //wgw.Add(1) //wgr.Add(8) go writeData(intChan) //go writeData(intChan, wgw.Done) //wgw.Wait() //close(intChan) for i := 0; i < 8; i++ { go judgData(intChan, resultChan, exitChan) } go func() { for sec := 0; sec < 8; sec++ { <-exitChan //如果没有值就会等待值写入,造成主线程的阻塞 } close(resultChan) }() // 这里用协程是不让这个取值堵塞主线程的取值 //time.Sleep(time.Second *10) //wgr.Wait() for { key, ok := <-resultChan if !ok { //这里会因为上面的协程没结束,没有关闭resultChan,ok的值一直未true而阻塞一直到所有协程执行完毕 break } fmt.Printf("素数:%v\n", key) } } ```
#6
更多评论
就很奇怪,协程的确都已经结束了,但是计算好像没有结束:screen
#1
wg传入进去是值传递副本,要么取地址 要么闭包方式共用外部wg
#2