美文网首页
协程求素数

协程求素数

作者: FredricZhu | 来源:发表于2020-04-30 06:41 被阅读0次
image.png
package main

import (
    "fmt"
    "time"
)

func IsSushu(n int) bool {
    res := true
    for i := 2; i <= n-1; i++ {
        if n%i == 0 {
            res = false
            break
        }
    }
    return res
}

func CalSuShu(start, end int, res chan int, ch chan int) {
    for i := start + 1; i <= end; i++ {
        if IsSushu(i) {
            res <- i
        }
    }

    ch <- 1
}

func main() {
    batch := 10
    totalNum := 200000

    start := time.Now().Unix()
    oneBatch := totalNum / batch
    //存放结果的切片
    res := make(chan int, totalNum)

    //根据batch大小,适配一下channel大小
    chNum := batch
    if totalNum%batch != 0 {
        chNum = batch + 1
    }
    calCh := make(chan int, chNum)

    //做完整分批的计算
    for i := 0; i < batch; i++ {
        go CalSuShu(i*oneBatch, (i+1)*oneBatch, res, calCh)
    }

    //最后一个若有未完成分批的计算
    if totalNum%batch != 0 {
        start := (batch - 1) * oneBatch
        end := totalNum
        go CalSuShu(start, end, res, calCh)
    }

    // 等待完成,关闭管道

    go func() {
        for i := 0; i < chNum; i++ {
            <-calCh
        }
        end := time.Now().Unix()
        fmt.Printf("使用协程,需要的时间: %v\n", end-start)
        close(res)

    }()

    //打印结果
    for {
        ele, ok := <-res
        if !ok {
            break
        }
        fmt.Println("ele=", ele)
    }

}

相关文章

网友评论

      本文标题:协程求素数

      本文链接:https://www.haomeiwen.com/subject/dheawhtx.html