Golang中超简单的协程同步工具
现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨CPU和IO,但从业务角度来看,又需要保持一致性,这个时候我们就需要协程同步技术。
<h3>流程图解</h3>从下图可以看到在3个协程运行的时间都不可控,但为了达到同步的目的,需要等待3个携程全部跑完再继续下面的流程。
Golang提供了使用非常方便的包<code>sync.waitgroup</code> ,这个包就提供了3个方法,
<ul><li><code>Add(delta int)</code> 添加携程记录
</li> <li><code>Done()</code> 移除携程记录
</li> <li><code>Wait()</code> 同步等待所有记录的携程全部结束
</li> </ul><h3>代码</h3> <pre><code class="lang-go hljs"> package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { for i := 0; i < 3; i { wg.Add(1) //创建一个协程,记录一次 go worker(i) } wg.Wait() //同步等待所有的协程全部执行完成 fmt.Println("All done !") } func worker(i int) { fmt.Println(i) time.Sleep(time.Second * time.Duration(i)) wg.Done() //携程结束,从记录中移除等同于Add(-1) } </code></code></pre>输出:
<pre><code class="lang-bash hljs"> 2 1 0 All done ! </code></code></pre>到此这篇关于“Golang中超简单的协程同步工具”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
Golang中超简单的协程同步工具
Golang 协程Goroutine到底是怎么回事?(一)
go 开了多少个goroutine 怎么看_Golang 协程Goroutine到底是怎么回事?(一)
FastHTTP源码分析——“百花齐放”的协程池
《Kotlin 极简教程》第9章 轻量级线程:协程(2)
golang/goroutine 和 swoole/coroutine 协程性能测试对比
聊一聊python和golang的协程区别
Go语言之goroutine协程详解
聊聊并发,进程通信方式,go协程简单应用场景
php能做分布式吗