第14章 并发、并行、协程

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
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容