当前位置 : 主页 > 网络编程 > PHP >

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

来源:互联网 收集:自由互联 发布时间:2023-09-07
1.开启4个协程完成求1..n之间有多少个素数 package main import ( "fmt" ) //第一个协程存储数据到管道里面 func putNum(putchan chan int){ for i:=1;i1000;i++ { putchan - i; } close(putchan);//关闭管道 } //读出是素

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<num;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;
}
}

}

 

【感谢龙石为本站提供api网关 http://www.longshidata.com/pages/apigateway.html】
网友评论