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

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
",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
",i);
    }
    close(mychan);
}
//接收数据
func recv(revchan <- chan int,exitchan chan bool){
    for {
        res,ok := <-revchan;
        if !ok {
            break;
        }
        fmt.Printf("data is[%v]
",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;
        }
    }

}
原文地址:https://www.cnblogs.com/zh718594493/p/14163803.html