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

相关推荐
星火10248 小时前
【LangChain4j系列06】ChatMemory 对话记忆管理
人工智能·后端
netCode8 小时前
Git一文带你理解如何使用
后端
乐观勇敢坚强的老彭8 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
睡觉时不困4428 小时前
12.LangChain 1.0+ 第二篇:Prompt、结构化输出与 LCEL 组件组合.发布清单
后端
圣殿骑士-Khtangc8 小时前
Go错误处理最佳实践进阶从error到panic的完整指南
golang
离陌在学C#8 小时前
C# 泛型:从基础到高级应用
开发语言·c#
ly76898 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
SomeB1oody8 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
萧瑟余晖8 小时前
Java深入解析篇三十之Java日志框架
java·开发语言
Herbert_hwt9 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法