golang 中 sync包

WaitGroup

WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成。

WaitGroup 总共有三个方法:Add(delta int), Done(), Wait()。简单的说一下这三个方法的作用。

Add:添加或者减少等待 goroutine 的数量

Done:相当于Add(-1)

Wait:执行阻塞,直到所有的WaitGroup数量变成 0

Go 复制代码
package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i = i + 1 {
        wg.Add(1)
        go func(n int) {
            // defer wg.Done()
            defer wg.Add(-1)
            EchoNumber(n)
        }(i)
    }

    wg.Wait()
}

func EchoNumber(i int) {
    time.Sleep(3e9)
    fmt.Println(i)
}

结果如下所示:

Go 复制代码
0
1
2
3
4

通过golang的goruntine来提供一种异步处理程序的能力。

这在多个耗时长的网络请求(如:调用API接口)时非常有用。其可将顺序执行变为并行计算,可极大提高程序的执行效率。也能更好的发挥出多核CPU的优势。

复制代码
go get github.com/freshcn/async
Go 复制代码
/ 建议程序开启多核支持
runtime.GOMAXPROCS(runtime.NumCPU())

// 耗时操作1
func request1()interface{}{
  //sql request...
}

// 耗时操作2
func request2()interface{}{
  //sql request...
}

// 新建一个async对象
async:=new async.NewAsync()

// 添加request1异步请求,第一个参数为该异步请求的唯一logo,第二个参数为异步完成后的回调函数,回调参数类型为func()interface{}
async.Add("request1",request1)
// 添加request2异步请求
async.Add("request2",request2)

// 执行
if chans,ok := async.Run();ok{
    // 将数据从通道中取回,取回的值是一个map[string]interface{}类型,key为async.Add()时添加的logo,interface{}为该logo回调函数返回的结果
    res := <-chans
    // 这里最好判断下是否所有的异步请求都已经执行成功
        if len(res) == 2 {
            for k, v := range res {
                //do something
            }
        } else {
            log.Println("async not execution all task")
        }
}

// 清除掉本次操作的所以数据,方便后续继续使用async对象
async.Clean()

如何用Go实现一个异步网络库?-腾讯云开发者社区-腾讯云

相关推荐
liu****7 小时前
Python简单爬虫实践案例
开发语言·爬虫·python
趁月色小酌***7 小时前
吃透Java核心:从基础语法到并发编程的实战总结
java·开发语言·python
黎雁·泠崖7 小时前
C 语言文件操作入门:文件基础认知 + 打开关闭 + 字符字符串读写精讲
c语言·开发语言
计算机毕设指导67 小时前
基于Django的本地健康宝微信小程序系统【源码文末联系】
java·后端·python·mysql·微信小程序·小程序·django
草莓熊Lotso7 小时前
技术深耕,破局成长:我的2025年度技术创作之路
大数据·开发语言·c++·人工智能·年度总结
Ccuno7 小时前
Java中常用的数据结构实现类概念
java·开发语言·深度学习
leaves falling7 小时前
c语言-数1到100的所有整数中数字9出行的个数
c语言·开发语言·算法
3824278277 小时前
python3网络爬虫开发实战 第2版:并发限制
开发语言·爬虫·python
曲莫终7 小时前
增强版JSON对比工具类
java·后端·测试工具·json
BD_Marathon7 小时前
Spring——核心概念
java·后端·spring