返回

使用go协程完成求素数问题

发布时间:2023-09-25 03:05:22 167

1.开启4个协程完成求1..n之间有多少个素数

package main

import (
"fmt"
)

//第一个协程存储数据到管道里面
func putNum(putchan chan int){
for i:=1;i<1000;i++ {
putchan <- i;
}
close(putchan);//关闭管道
}
//读出是素数管道
func primNum(puuchan chan int,primchan chan int,exitchan chan bool){
var flag bool;
for {
num,ok:=<-puuchan;//读出数据
if !ok {
break;
}
flag=true;
for i:=2; i if num % i == 0 {
flag = false;
break;
}
}
if flag {
primchan <- num;
}
}
exitchan <- true;
}
func main(){
puchan:=make(chan int,2000);//需要找的数字
primchan :=make(chan int ,2000);//存储是素数的数字
exithcan:=make(chan bool,4);//设计退出的管道

go putNum(puchan);//写入数据
for i:=0;i<4;i++{//等待处理结果4个协程
go primNum(puchan,primchan,exithcan);//开启4个协程
}
go func(){
for i:=0;i<4;i++{
<-exithcan;
}
close(primchan);//关闭素数管道
}()

for {
res,ok := <- primchan;
if !ok {
break;
}
fmt.Printf("素数=%d\n",res);
}
fmt.Println("main线程退出");
}

 2.使用管道变成读管道和写管道案例

package  main

import (
"fmt"
"time"
)

//管道声明只读和只写
//var mychan chan <- int;//声明了一个只写管道
//var mychan2 <- chan int;//声明了只读管道
//案例演示

//想管道里面写入数据
func send(mychan chan <- int){
for i:=0;i<200;i++ {
mychan <- i;
time.Sleep(time.Second * 2);
fmt.Printf("send data is %v\n",i);
}
close(mychan);
}
//接收数据
func recv(revchan <- chan int,exitchan chan bool){
for {
res,ok := <-revchan;
if !ok {
break;
}
fmt.Printf("data is[%v]\n",res);
time.Sleep(time.Second*2);
}
exitchan <- true;
}
func main(){
ch:=make(chan int,10);//声明了一个管道
exitch:=make(chan bool,3);//退出管道
go send(ch);
go recv(ch,exitch);
for {
flag:= <-exitch;
if !flag {
break;
}
}

}

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
婚恋交友网站开发搭建源码分享 2023-09-25 00:08:40