Golang - 并发编程入门

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

相关阅读更多精彩内容

友情链接更多精彩内容