WaitGroup
WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成。
WaitGroup 总共有三个方法:Add(delta int), Done(), Wait()。简单的说一下这三个方法的作用。
Add:添加或者减少等待 goroutine 的数量
Done:相当于Add(-1)
Wait:执行阻塞,直到所有的WaitGroup数量变成 0
package mainimport ("fmt""sync""time"
)func main() {var wg sync.WaitGroupfor 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)
}
结果如下所示:
0
1
2
3
4
通过golang的goruntine来提供一种异步处理程序的能力。
这在多个耗时长的网络请求(如:调用API接口)时非常有用。其可将顺序执行变为并行计算,可极大提高程序的执行效率。也能更好的发挥出多核CPU的优势。
go get github.com/freshcn/async
/ 建议程序开启多核支持
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实现一个异步网络库?-腾讯云开发者社区-腾讯云