• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang基础之Gocurrency并发

    goroutine只是由官方实现的超级"线程池"而已,每个实例4-5kb的栈内存占用和用于实现机制而大幅减少的创建和销毁开销。

    并发不是并行(多CPU):  Concurrency Is Not Parallelism

    并发主要由切换时间片来实现"同时"运行,并行则是直接利用多核实现多线程的运行,但Go可以设置使用核数,以发挥多核计算机的能力。

    package main
    import (
      "fmt"
      "time"
    )
    
    func Go() {
      fmt.Println("1234...") 
    
    }
    
    func main() {
      go Go()        //go关键字构成多线程
      time.Sleep(2 * time.Second) //主程序睡眠2s
    }
    
    

    Goroutine 奉行通过 通信来共享内存 ,而不是 共享内存来通信 。

    Channel

    package main
    import (
      "fmt"
    )
    
    func main() {         //主程序
      c := make(chan bool)   //初始化一个chan类型
      go func() {        //子程序
        fmt.Println("123...") //执行主程序
        c - true       //通过-存入bool类型到chan中
      }()
    fmt.Println(1)        //程序执行步骤:1st
    read_chan := -c       //-c 从chan中读取bool,程序执行步骤:2nd
    fmt.Println(read_chan)    //程序执行步骤:3rd
    }
    
    /*output
    1st   1      
    2nd   123...
    3rd   true
    */
    
    

    注意以上程序的执行顺序(channel无缓存时):先执行读取操作 c-c ,因为channel中没有值,所以程序发生阻塞,此时执行chanel 写操作 ,然后再执行读操作。

    package main
    import (
      "fmt"
    )
    
    func main() {
      c := make(chan bool)   //初始化一个chan类型
      go func() {        //go结合匿名函数,构造并发
        fmt.Println("123...") //执行主程序
        c - true       //通过-存入bool类型到chan中
        close(c)       //关闭通道:必须明确在哪个地方关闭
      }()
    
      for v := range c {    //for循环chanel
      }
    }
    
    /*output
      123...
      true
    */
    
    
    package main
    import (
      "fmt"
    )
    
    func main() { //主程序
      c := make(chan bool, 1)  //初始化一个chan类型,缓存为2
      go func() {        //子程序
        fmt.Println("123...") //执行主程序,执行步骤:2
        c - true       //写操作,执行步骤:2
      }()
      fmt.Println(2)      //执行步骤:1
      fmt.Println(123, -c)   //读操作,执行步骤:2
      fmt.Println(3)      //执行步骤:3
    }
    
    /*output
    1  2
    2  123...
    2  123 true
    3  3
      */

    设置缓存后,程序为异步,读,写操作同时完成,当读取channal中无数据时,也不会造成堵塞,因为与此同时,写操作也将发生。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 如何利用Golang写出高并发代码详解
    • Golang极简入门教程(三):并发支持
    • 详解Golang 中的并发限制与超时控制
    • golang中sync.Map并发创建、读取问题实战记录
    • golang实现并发数控制的方法
    • golang高并发的深入理解
    上一篇:golang struct 实现 interface的方法
    下一篇:golang基础之Interface接口的使用
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang基础之Gocurrency并发 golang,基础,之,Gocurrency,并发,