1.计算1到100000范畴内的素数golang实现
package concurrentdemoimport ( "fmt" "sync")//1-10000000var start int = 0 //开始值// var end int = 1000000 //完结值var end int = 1000var 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.后果