脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Go语言中goroutine和WaitGroup的使用示例详解

Go语言中goroutine和WaitGroup的使用示例详解

2023-03-05 12:07水淹萌龙 Golang

goroutine 是Go中一个轻量级的线程, 只需要一个go关键字就可以创建一个goroutine,这篇文章主要介绍了Go语言中goroutine和WaitGroup的使用,需要的朋友可以参考下

Go语言中goroutine和WaitGroup的使用

介绍

goroutine 是Go中一个轻量级的线程, 只需要一个go关键字就可以创建一个goroutine
WaitGroup则是用于多个goroutine 协作的时候使用, 可以指定多个goroutine 一起完成指定动作之后执行对应的逻辑。
例如:100M赛跑,要等所有的运动员都就位,才能发令开始, 这个类似于Java中的countDownlatch

例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main
 
import (
    "fmt"
    "math/rand"
    "strconv"
    "sync"
    "time"
)
 
func main() {
    // 随机数种子
    rand.Seed(time.Now().Unix())
    // 生命WaitGroup, 指定五个
    var wait sync.WaitGroup
    wait.Add(5)
    for i := 0; i < 5; i++ {
        i := i
        go func() {
            waitTime := rand.Intn(10)
            time.Sleep(time.Duration(waitTime) * time.Second)
            fmt.Println("I'm " + strconv.Itoa(i) + ". sleep" + strconv.Itoa(waitTime))
            // 表示准备好了
            wait.Done()
        }()
    }
    fmt.Println("Wait  start")
    // 等待所有人准备好
    wait.Wait()
    fmt.Println("All  start")
}

以上程序输出结果

Wait  start
I'm 3. sleep1
I'm 1. sleep2
I'm 2. sleep3
I'm 4. sleep4
I'm 0. sleep8
All  start

会在wait.Wait()处卡住,等待执行了五次wait.Done() ,才放行。

扩展:Go的goroutine与sync.WaitGroup的初步使用

goroutine的使用以及sync.WaitGroup

emmm,没啥好介绍的,就简单的使用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
 
import (
    "fmt"
    "sync"
)
 
//协程计数器
var wg sync.WaitGroup
 
func main() {
    fmt.Println("嘻嘻")
 
    for i := 0; i < 5; i++ {
        wg.Add(1)//协程计数器加1
        go func(x int) {
            defer wg.Done()// 协程计数器减1
            fmt.Println(x)
        }(i)
    }
 
    wg.Wait()// 等待所有的协程执行完毕
    fmt.Println("主线程退出")
}

到此这篇关于Go语言中goroutine和WaitGroup的使用的文章就介绍到这了,更多相关go goroutine和WaitGroup的使用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_21047625/article/details/124530785

延伸 · 阅读

精彩推荐
  • Golanggolang协程设计及调度原理

    golang协程设计及调度原理

    这篇文章主要介绍了golang协程设计及调度原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下...

    ysj8302022-10-26
  • GolangGo中strings的常用方法详解

    Go中strings的常用方法详解

    这篇文章主要介绍了Go中strings的常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    大漠胡萝卜17132020-06-06
  • Golanggo按行读取文件的三种实现方式汇总

    go按行读取文件的三种实现方式汇总

    最近有遇到需要用go读取文件的情况,下面这篇文章主要给大家介绍了关于go按行读取文件的三种实现方式,文中通过实例代码介绍的非常详细,需要的朋友可以...

    CK持续成长5172022-11-20
  • GolangGolang验证器之validator是使用详解

    Golang验证器之validator是使用详解

    Validator是一个 Golang 的第三方库,用于对数据进行校验,常用于 API 的开发中,对客户端发出的请求数据进行严格校验,防止恶意请求。本文通过示例详细讲...

    yi个俗人10172022-11-12
  • GolangGo gRPC服务proto数据验证进阶教程

    Go gRPC服务proto数据验证进阶教程

    这篇文章主要为大家介绍了Go gRPC服务proto数据验证进阶教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    烟花易冷人憔悴5162022-10-21
  • Golanggo语言实现通过FTP库自动上传web日志

    go语言实现通过FTP库自动上传web日志

    这篇文章主要介绍了go语言实现通过FTP库自动上传web日志,非常简单实用,需要的小伙伴快来参考下吧。 ...

    脚本之家3592020-04-25
  • GolangGolang语言实现gRPC的具体使用

    Golang语言实现gRPC的具体使用

    本文主要介绍了Golang语言实现gRPC的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    鹿鱼8272022-08-03
  • Golanggo开发中引用静态库.a文件的方法

    go开发中引用静态库.a文件的方法

    这篇文章主要介绍了go开发中引用静态库.a文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    archmage19917182021-02-01