第14章 并发、并行、协程

2020-01-25  本文已影响0人  yezide

1、协程

package main

import (
    "fmt"   
    "time"
)

func main() {
    fmt.Println("主函数开始")
    go longWait()
    go shortWait()
    time.Sleep(4 * 1e9)
    fmt.Println("主函数结束")
}

func longWait() {
    fmt.Println("开始longWait.")
    time.Sleep(5 * 1e9)
    // 以下代码不会被执行,原因是主函数只等了4s,main退出后协程被销毁
    fmt.Println("结束longWait.")
}

func shortWait() {
    fmt.Println("开始shortWait.")
    time.Sleep(2 * 1e9)
    fmt.Println("结束shortWait.")
}

2、 信道

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)
    go sendData(ch)
    go getData(ch)
    time.Sleep(10 * 1e9)
}

func sendData(ch chan string) {
    ch <- "welcome "
    ch <- "to "
    ch <- "the "
    ch <- "junnel"
}

func getData(ch chan string) {
    for {
        input := <- ch
        fmt.Printf("%s ", input)
    }
}

3、 一个好玩的计算素数的例子

package main

import "fmt"

// 构建队列,放入2-100的整数
func genData(ch chan int) {
    for i :=2; i <= 100; i++ {
        ch <- i
    }
    defer close(ch)
}

// 素数计算过程. 思路是原始数据 % 第1个,如果不符合去掉
// 主要靠主函数那里
func filterData(originCh chan int, newCh chan int, firstNum int) {
    for {
        num := <- originCh
        if num % firstNum != 0 {
            newCh <- num
        }
    }
}

func main() {
    // 初始化数据
    originCh := make(chan int)
    go genData(originCh)

    for {
        firstNum := <- originCh
        fmt.Print(firstNum, " ")
        newCh := make(chan int)
        go filterData(originCh, newCh, firstNum)
        originCh = newCh
    }
}
上一篇下一篇

猜你喜欢

热点阅读