教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang中超简单的协程同步工具

Golang中超简单的协程同步工具

发布时间:2022-02-07   编辑:jiaochengji.com
教程集为您提供Golang中超简单的协程同步工具等资源,欢迎您收藏本站,我们将为您提供最新的Golang中超简单的协程同步工具资源
<h2>Golang中超简单的协程同步工具</h2>
image
<h3>从需求出发</h3>

现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨CPU和IO,但从业务角度来看,又需要保持一致性,这个时候我们就需要协程同步技术。

<h3>流程图解</h3>

从下图可以看到在3个协程运行的时间都不可控,但为了达到同步的目的,需要等待3个携程全部跑完再继续下面的流程。

image
<h3>解</h3>

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>
image

到此这篇关于“Golang中超简单的协程同步工具”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang中超简单的协程同步工具
Golang 协程Goroutine到底是怎么回事?(一)
go 开了多少个goroutine 怎么看_Golang 协程Goroutine到底是怎么回事?(一)
FastHTTP源码分析——“百花齐放”的协程池
《Kotlin 极简教程》第9章 轻量级线程:协程(2)
golang/goroutine 和 swoole/coroutine 协程性能测试对比
聊一聊python和golang的协程区别
Go语言之goroutine协程详解
聊聊并发,进程通信方式,go协程简单应用场景
php能做分布式吗

[关闭]
~ ~