zoukankan      html  css  js  c++  java
  • 使用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;
            }
        }
    
    }
  • 相关阅读:
    sort-list leetcode C++
    sum-root-to-leaf-numbers leetcode C++
    sum-root-to-leaf-numbers leetcode C++
    path-sum-ii leetcode C++
    path-sum-ii leetcode C++
    0139 函数的两种声明方式
    0138 函数可以调用另外一个函数
    0137 函数案例:数组翻转、冒泡排序、判断闰年
    0136 JavaScript中 arguments 的使用
    0135 函数的返回值:return 语句、终止函数 、只能返回一个值、没有 return 返回 undefined、break &continue&return 的区别
  • 原文地址:https://www.cnblogs.com/zh718594493/p/14163803.html
Copyright © 2011-2022 走看看