美文网首页
Golang - 并发编程入门

Golang - 并发编程入门

作者: 陈光环_18 | 来源:发表于2021-10-03 15:42 被阅读0次

    1. 并行和并发

    • 并行:在同一时刻,有多条指令在多个CPU处理器上同时执行
    • 2个队伍,2个窗口,要求硬件支持
    • 并发:在同一时刻,只能有一条指令执行,但多个进程指令被快速地轮换执行
    • 2个队伍,1个窗口,要求提升软件能力

    2. go语言并发优势

    • go从语言层面就支持了并发
    • 简化了并发程序的编写

    3. goroutine是什么

    • 它是go并发设计的核心
    • goroutine就是协程,它比线程更小,十几个goroutine在底层可能就是五六个线程
    • go语言内部实现了goroutine的内存共享,执行goroutine只需极少的栈内存(大概是4~5KB)

    4. 创建goroutine

    • 只需要在语句前添加go关键字,就可以创建并发执行单元
    package main
    import (
    "fmt"
    "time"
    )
    
    //测试协程
    //循环打印内容
    func newTask() {
      i := 0
      for {
        i++
        fmt.Printf("new goroutine:i=%d\n", i)
        time.Sleep(1 * time.Second)
      }
    }
    
    //main()相当于是主协程
    func main() {
      //启动子协程
      go newTask()
      i := 0
      for {
        i++
        fmt.Printf("main goroutine:i=%d\n", i)
        time.Sleep(1 * time.Second)
      }
    }
    
    • 开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行
    • 如果主协程退出了,其他任务还执行吗?不执行
      package main
      
      import (
         "fmt"
         "time"
      )
      
      //main()相当于是主协程
      func main() {
         //匿名子协程
         go func() {
            i := 0
            for {
               i++
               fmt.Println("子协程 i=", i)
               time.Sleep(1 * time.Second)
            }
         }()
         i := 0
         for {
            i++
            fmt.Println("主协程 i=", i)
            time.Sleep(1 * time.Second)
            //主协程第二次后退出
            if i == 2 {
               break
            }
         }
      }
    
    • 程序没任何输出,也不报错
      package main
      
      import (
         "fmt"
         "time"
      )
      
      //main()相当于是主协程
      func main() {
         //匿名子协程
         go func() {
            i := 0
            for {
               i++
               fmt.Println("子协程 i=", i)
               time.Sleep(1 * time.Second)
            }
         }()
      }
    

    相关文章

      网友评论

          本文标题:Golang - 并发编程入门

          本文链接:https://www.haomeiwen.com/subject/liavnltx.html