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

相关推荐
星晨雪海2 分钟前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言
ACP广源盛1392462567325 分钟前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
Ricky_Theseus40 分钟前
C++右值引用
java·开发语言·c++
Rick19931 小时前
Java内存参数解析
java·开发语言·jvm
我是大猴子1 小时前
Spring代理类为何依赖注入失效?
java·后端·spring
勿忘,瞬间1 小时前
多线程之进阶修炼
java·开发语言
码事漫谈1 小时前
手把手带你部署本地模型,让你Token自由(小白专属)
前端·后端
hoiii1872 小时前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
炘爚2 小时前
C++ 右值引用与程序优化
开发语言·c++
码农BookSea2 小时前
ReAct:让大模型学会边想边做
后端·ai编程