共计 1201 个字符,预计需要花费 4 分钟才能阅读完成。
1. 计算 1 到 100000 范畴内的素数 golang 实现
package concurrentdemo
import (
"fmt"
"sync"
)
//1-10000000
var start int = 0 // 开始值
// var end int = 1000000 // 完结值
var end int = 1000
var interval int = 100 // 划分 goroutine 距离
var wg sync.WaitGroup
func calResult(x int) bool { // 素数计算函数,返回 boolean 类型的值
max := x/2 + 1
result := true
for i := 2; i < max; i++ {
if x%i == 0 {
result = false
break
}
}
return result
}
func startTask(start, end, interval int) { // 开始工作
resultChan := make(chan int,10) // 素数计算后的后果放到 resultChan 中
exitChan := make(chan bool,16) // 为了晓得各个 goroutine 执行结束,而后敞开 resultChan
time := (end - start) / interval // 总 goroutine
fmt.Printf("time:%d \n", time)
for i := 1; i <= time; i++ {wg.Add(1)
startTemp := (i-1)*interval + start
endTemp := i * interval
fmt.Printf("startTemp:%d,endTemp:%d \n", startTemp, endTemp)
go resolve(startTemp, endTemp, resultChan,exitChan)
}
wg.Add(1)
go func () {
for i := 1; i <= time; i++ { // 循环取总 time 次
<- exitChan
}
wg.Done()
close(resultChan) // 在所有 goroutine 将本人的范畴内的素数计算完之后,并发送到 resultChan 后,敞开 resultChan
}()
for v := range resultChan{fmt.Printf("result:%d \n",v)
}
fmt.Println("main finished")
wg.Wait()}
func resolve(start, end int, resultChan chan<- int,exitChan chan<- bool) {
for i := start; i < end; i++ {if calResult(i) {resultChan <- i}
}
exitChan <- true
fmt.Printf("start:%d,end:%d finished \n", start, end)
wg.Done()}
func ConcurrentDemoT() {startTask(start, end, interval)
}
2. 后果
正文完