Golang 的 Goroutine

发布时间:2022-06-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Golang 的 Goroutine脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Goroutine的概念

  1. 当一个函数创建为goroutine时候,就是在匿名函数前加一个go ,golang会把这个函数当做一个独立的工作单元,然后使用golang内部的逻辑处理器进行执行。golang的逻辑处理器在操作系统之上,并且会将golang的逻辑处理器和操作系统的线程进行绑定。
  2. golang的调度器会在任何给定的时间,都会控制哪个goroutine在哪个逻辑处理器上执行。
  3. 如果在逻辑处理器遇见会有阻塞的goroutine,调度器则会创建一个新的线程进行执行,执行完毕后把此goroutine在加到逻辑处理器中,然后保留当前这个线程,以备后面使用
  4. 并发不等于并行。并行的关键是同时做很多事情,并发是指同时管理很多事情
  5. 如果想让goroutine并行,则必须使用多余一个逻辑处理器,而且电脑必须多核,否则多个逻辑处理器也是在单核上并发

示例代码

package main

import (
  "fmt"
  "runtime"
  "sync"
)

func main() {
  //设置golang的逻辑处理器为 1
  runtime.GOMAXPROCS(1)
  //使用计数信号量 设置需要运行的goroutine 如果设置的信号量没有全部执行完成,那么主程序会阻塞
  var wg sync.WaitGroup
  wg.Add(2) //这里是两个 对应下面的go func 的匿名函数

  fmt.Println("Start Goroutines")
  //声明匿名函数,并创建一个goroutine
  go func() {
    defer wg.Done() //使用关键defer 在程序执行完成后执行WaitGroup减1
    //打印三次小写字母
    for count := 0; count < 3; count++ {
      for char := 'a'; char < 'a'+26; char++ {
        fmt.Printf("%c ",char)
      }
    }
  }()

  go func() {
    defer wg.Done()
      //打印三次大写字母
      for count := 0; count < 3; count++ {
        for char := 'A'; char < 'A'+26; char++ {
        fmt.Printf("%c ",char)
      }
    }
  }()
  //等待goroutine结束
  fmt.Println("Waiting To Finish...")
  wg.Wait() //这里会阻塞主程序退出,否则goroutine执行未结束的时候主程序会直接退出

  fmt.Println("Terminating Program")
}

运行结果

D:GOstudydemo30>go run main.go
Start Goroutines
Waiting To Finish...
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z Terminating Program

脚本宝典总结

以上是脚本宝典为你收集整理的Golang 的 Goroutine全部内容,希望文章能够帮你解决Golang 的 Goroutine所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:并发