• Go学习之路:并发(DAY 3)



    前引


    听了会歌 一看了下今天已经下午2:50了
    我们学校也好像开始放学生们回家了

    那今天最后就愉快愉快的把我们的 A Tour Of Go 最后一程给送走吧
    并发


    并发


    1、Go协程/简单创建


    goroutine 大名鼎鼎的Go协程 原语言支持的协程
    简单测试一下吧 这里也就是简单介绍


    package main
    
    import "fmt"
    
    func TestGoroutine(str *string) {
    	fmt.Println(*str)
    }
    
    func main() {
    	str := "hello"
    	teststr := "say hello"
    	go TestGoroutine(&str)
    	TestGoroutine(&teststr)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行效果
    在这里插入图片描述


    2.1、信道/简单创建信道


    可以把其作为linux中的共享信道 作为pipe用
    其实我个人认为就是pipe 而pipe在linux作为共享进程的通讯工具

    这个就作为go中独有的channel 下面是简单应用


    package main
    
    import "fmt"
    
    func TestGoroutine(str *string) {
    	fmt.Println(*str)
    }
    
    func Sum(slice []int, channel chan int) {
    	sum := 0
    	for _, num := range slice {
    		sum += num
    	}
    	channel <- sum
    }
    
    func main() {
    	slice := []int{1, 2, 3, 4, 5, 10, 12, 30}
    	ch1, ch2 := make(chan int), make(chan int)
    
    	go Sum(slice[:len(slice) / 2], ch1)
    	go Sum(slice[len(slice) / 2:], ch2)
    	sum1, sum2 := <-ch1, <-ch2
    	fmt.Println(sum1, sum2, sum1 + sum2)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2.2、信道/限制了大小的信道


    设置大小的信道 一旦信道的空间被塞满了 一旦继续塞了之后则直接会被阻塞

    创建出信道的格式是make(chan type, space int)


    例如下面 所有的协程则将休眠

    package main
    
    import "fmt"
    
    func main() {
    	ch := make(chan int, 2)
    	ch <- 1
    	ch <- 2
    	ch <- 3
    	fmt.Println(<-ch)
    	fmt.Println(<-ch)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述


    2.3、信道/range close信道


    rangeclose信道

    close信道的时候 如果对方不听的进入range状态 则可以直接断开
    range则是一直获取


    下面是简单的例子 就用示例代码吧

    package main
    
    import (
    	"fmt"
    )
    
    func fibonacci(n int, c chan int) {
    	x, y := 0, 1
    	for i := 0; i < n; i++ {
    		c <- x
    		x, y = y, x+y
    	}
    	close(c)
    }
    
    func main() {
    	c := make(chan int, 10)
    	go fibonacci(cap(c), c)
    	for i := range c {
    		fmt.Println(i)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行效果
    在这里插入图片描述


    3.1、Select语句


    select语句类似于IO多路复用了 只不过在这里和IO多路复用原理感觉是差不多的 但不多揣测
    下面用示例代码当例子


    package main
    
    import "fmt"
    
    func fibonacci(c, quit chan int) {
    	x, y := 0, 1
    	for {
    		select {
    		case c <- x:
    			x, y = y, x+y
    		case <-quit:
    			fmt.Println("quit")
    			return
    		}
    	}
    }
    
    func main() {
    	c := make(chan int)
    	quit := make(chan int)
    	go func() {
    		for i := 0; i < 10; i++ {
    			fmt.Println(<-c)
    		}
    		quit <- 0
    	}()
    	fibonacci(c, quit)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行效果
    在这里插入图片描述


    剩下的就是并发了 这个就交给项目中实际操作来熟悉了
    今天主要花时间去填写资料了 剩下的就不说了

    go的新手村先走在这里吧

  • 相关阅读:
    宇凡微Y62R射频433接收芯片(功能强大的合封解决方案)
    Redis八股文目录
    早上空腹喝水,比不吃早餐更伤胃?起床后先做2件事
    【计算机基础】让我们重新认识一下Visual Stduio及其操作,知识点汇总!!
    HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题
    八股文-TCP的四次挥手
    如何执行建设项目的时间影响分析?
    SpringCloud:NetFlix(下)
    Vue的生命周期
    Cosmos模块化功能链 走向亿级用户的超级Dapp时代
  • 原文地址:https://blog.csdn.net/qq_37500516/article/details/128132237