
请求统计1-200000的关于数字中,哪些是独霸素数?这个问题在本章开篇就提出来了 ,可独霸goroutine和channel来完成
传统的成统编制,就是计素独霸一个轮回 ,轮回的数的思路剖断各个数是不是是素数【ok】
独霸并发/并行的编制,将统计素数的关于义务分拨给多个(x个)goroutine往完成 ,完成义务时分短
分化思路图 :

代码完成 :
package mainimport ( "fmt" "time")// 需求
:// 请求统计1-200000的独霸数字,哪些是成统素数 ?这个问题在本章开篇就提出了,如今我们有goroutine和channel的计素常识后 ,便可以完成了【测试数据:80000】// 分化思路
:// 传统的数的思路编制
,就是关于独霸一个轮回,轮回的独霸剖断各个数是不是是素数【ok】// 独霸并发/并行的编制,将统计素数的成统义务分拨给多个(x个)goroutine往完成 ,完成义务时分短 // 1. 向intChan放进1-8000的计素数字func putNum(intChan chan int) { for i := 1; i <= 20000; i++ { intChan <- i } // 封锁intChan close(intChan)} // 从intChan中掏出数据,并剖断可否为素数 ,数的思路假定是,就放进到primeChanfunc primeNum1(intChan chan int, primeChan chan int, exitChan chan bool) { // 独霸for轮回 var flag bool for { time.Sleep(time.Millisecond * 10) num, ok := <- intChan if !ok { //intChan取不到,且封锁了管道 break } flag = true // 假定是素数 // 剖断num是不是是素数 for i := 2; i < num; i++ { if num % i == 0 { // 声明该num不是素数 flag = false break } } if flag { // 将这个数放到primeChan primeChan<- num } } fmt.Println("有一个prieNum 协程因为取不到数据,介入") // 这里我们还不克不及封锁primeChan // 向exitChan写进true exitChan <- true}func main() { var intChan chan int = make(chan int, 1000) var primeChan chan int = make(chan int,2000) // 标识介入的管道 exitChan := make(chan bool,4) // 开启一个协程,向intChan放进 1-8000个数 go putNum(intChan) // 开启4个协程
,从 intChan中掏出数据
,并剖断可否为素数
,假定是就放进到primeChan for i := 0; i < 10000; i++ { go primeNum1(intChan,primeChan,exitChan) } // 这里我们主线程,举办措置 go func() { for i := 0; i < 4; i++ { <-exitChan } // 当我们从exitChan中掏出了4个下场,便可以忧虑的封锁primeChan close(primeChan) }() // 遍历我们的primeChan,把下场掏出 for { res, ok := <- primeChan if !ok { break } // 将下场掏出 fmt.Printf("素数=%d\n",res) } fmt.Println("main线程介入")}结论 :独霸go协程连络channel后,奉行的速度,会除夜除夜 进步
go中可以轻松开启1万个协程
到此这篇关于golang独霸channel和goroutine完成统计素数的文章就引见到这了,更多相干golang统计素数内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!
本文由作文网知识栏目发布,感谢您对作文网的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“关于golang独霸channel和goroutine完成统计素数的思路”
