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实现一个异步网络库?-腾讯云开发者社区-腾讯云

相关推荐
masa010几秒前
JavaScript--JavaScript基础
开发语言·javascript
拓端研究室TRL3 分钟前
Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...
开发语言·python·重构
一只特立独行的猪6111 小时前
Java面试——集合篇
java·开发语言·面试
吃面不喝汤661 小时前
Flask + Swagger 完整指南:从安装到配置和注释
后端·python·flask
大得3692 小时前
go注册中心Eureka,注册到线上和线下,都可以访问
开发语言·eureka·golang
讓丄帝愛伱2 小时前
spring boot启动报错:so that it conforms to the canonical names requirements
java·spring boot·后端
weixin_586062022 小时前
Spring Boot 入门指南
java·spring boot·后端
小珑也要变强3 小时前
队列基础概念
c语言·开发语言·数据结构·物联网
AI原吾5 小时前
掌握Python-uinput:打造你的输入设备控制大师
开发语言·python·apython-uinput
机器视觉知识推荐、就业指导5 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt