zoukankan      html  css  js  c++  java
  • 一个小事例,了解golang通道阻塞模式

    在学习golang中,channel真的是让人捉摸不透的东西,本来我自以为我理解了协程阻塞的用法了,结果就下面这个小例子,我还是在打印输出后才搞明白到底怎么回事?

    当然了,这也是我自身对协程这块不太熟造成的呀,另外,学习还真不能想当然,尤其是编程这块,真是要多实践,有时候你不经意的一点小举动,可能都会让你学到东西,甚至让你受益非浅的。

    下面就是那个小例子,通过输出调试看结果后,也让我比以前更了解这个channel阻塞模式了。

    package main
    import (
    	"fmt"
    	"sync"
    )
    var wg sync.WaitGroup
    var printChar chan int
    func prinNums() {
    	defer wg.Done()
    	for i:=0;i < 2; i++ {
    		printChar <- 1111
    		fmt.Println(<-printChar)
    	}
    }
    
    func printChars(){
    	defer wg.Done()
    	for i:=0;i < 2; i++ {
    		fmt.Println("阻1")
    		fmt.Println(<-printChar)
    		fmt.Println("阻2")
    		fmt.Println("出来1")
    		printChar <- 1222
    		fmt.Println("出来2")
    	}
    }
    func main(){
    	printChar = make(chan int)
    	
    	wg.Add(2)
    	
    	go prinNums()
    	go printChars()
    
    	wg.Wait()
    }
    
    
    输出结果为:
    阻1
    1111
    阻2
    出来1
    1222
    出来2
    阻1
    1111
    阻2
    出来1
    1222
    出来2
    

    看完结果,再仔细分析下就基本明白了。

    其实,我最开始是在channel赋值和输出这里犯糊涂了,一直没理解到,比如printNums函数这里

    printChar <- 1111
    fmt.Println(<-printChar)
    

    我开始想当然的以为直接赋值后,然后就能直接取值了。这就是没理解协程阻塞和调度。当执行到 printChar <- 1111 这里时,因为是阻塞模式,那么它必须等待其它协程将它里面的数据取走,它后面的代码也不会执行,就类似于php的yield,它将按制权让出来给其它的协程。

    其它协程将channel里面的值取出来后,继续执行协程阻塞前的那些代码,对比以上的输出就很容易看出来了。

    当然了,如果是懂的人,我这个会让人笑掉大牙,但是没关系,这也是我自已自学习路上学到的东西,这就够了。

  • 相关阅读:
    【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性
    【效率工具】史上最好用的SSH一键登录脚本,第三版更新!
    WebGL简易教程——目录
    写技术博客的一些心得体会
    空间直线与球面相交算法
    three.js中帧缓存的使用
    curl使用小记(二)——远程下载一张图片
    curl使用小记(一)
    three.js中场景模糊、纹理失真的问题
    关于three.js中的矩阵更新
  • 原文地址:https://www.cnblogs.com/smartrui/p/11363154.html
Copyright © 2011-2022 走看看