首页 > 其他分享 >[Go] Go routines with WaitGroup and async call

[Go] Go routines with WaitGroup and async call

时间:2024-02-06 22:12:16浏览次数:33  
标签:wg WaitGroup currency routines go getCurrencyData Done Go

So, let's say we have a function to fetch crypto currencies price:

package main

import (
	"fmt"
	"sync"

	"project/api"
)

func main() {
    go getCurrencyData("BTC")
    go getCurrencyData("BCH")
    go getCurrencyData("ETH")
}

func getCurrencyData(currency string) {
	rate, err := api.GetRate(currency)

	if err == nil {
		fmt.Printf("The rate for %v is %.2f \n", rate.Currency, rate.Price)
	}
}

We know what will happen for this code, after main function ends, all the program ends automaticlly, we might see nothing from the output.

 

WaitGroup

WaitGroup can helps, let change code a little bit:

func main() {
	currencies := []string {"BTC", "ETH", "BCH"}
	var wg sync.WaitGroup

	for _, currency := range currencies {
	    wg.Add(1)
	    go getCurrencyData(currency)
        wg.Done()
	}

	wg.Wait()
}

Well, current code won't work, but it is important to understand what WaitGroup doing for us, so basiclly it add 1 to a internal count of waitgroup by calling Add(1), and also subtract 1 by calling Done()Wait()is used to wait the internal counter to be zero.

But why it doesn't work,  it is because after go getCUrrencyData(currency)wg.Done()get called immedicatly, we are not waiting go getCurrencyData(currency) to finish at all

go getCurrencyData(cy) // do work in another thread
wg.Done() // continue in main thread

 

Using Async call

Now, let modify the code to make it work

func main() {
	currencies := []string {"BTC", "ETH", "BCH"}
	var wg sync.WaitGroup

	for _, currency := range currencies {
		wg.Add(1)
		go func (cy string) {
			getCurrencyData(cy)
			wg.Done()
		}(currency)
	}

	wg.Wait()
}

We wrap getCurrencyDataand wg.Done()in a go func() {}().

Since getCurrencyDataand wg.Done()are now working in sync, so wg.Done()will actually work.

标签:wg,WaitGroup,currency,routines,go,getCurrencyData,Done,Go
From: https://www.cnblogs.com/Answer1215/p/18010361

相关文章

  • 离散化(Discretization Algorithm)
    简介离散化——把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率,即:在不改变数据相对大小的条件下,对数据进行相应的缩小。离散化本质上可以看成是一种\(哈希\),其保证数据在哈希以后仍然保持原来的全/偏序关系。描述离散化用于处理一些个数不多,但是数......
  • 2月摸鱼计划04 Go语言依赖管理
    2.0依赖管理这一章我们主要讲解go的依赖管理,主要涉及go依赖管理的演进路线和gomodule实践依赖指各种开发包对于helloworld以及类似的单体函数只需要依赖原生SDK,而实际工程会相对复杂,我们不可能基于标准库0~1编码搭建,而更多的关注业务逻辑的实现,而其他的涉及框架、日志、driver......
  • Django
    Django一、MTV和MVC的区别首先介绍Django的设计模式,也就是MTV,在这之前我们先了解MVC模式。1、MVC设计模式MVC是Model-View-Controller的缩写Model代表数据存储层,是对数据表的定义和对数据的增删改查;View代表视图层,是系统前段显示部分,它负责显示什么和如何进行显示;Controll......
  • golang之设计模式
    [选项模式]packagemainimport"fmt"typeOptionFuncfunc(*DoSomethingOption)typeDoSomethingOptionstruct{aintbstringcbool}funcNewDoSomethingOption(cbool,opts...OptionFunc)*DoSomethingOption{s:=&DoSomethi......
  • mongodb大数据量分页查询优化
    业务背景mongodb大数据量分页查询主要耗时是查询总条数,所以有两种优化方式1.不查询总条数,查询最近N页数据[改动略多,执行耗时很短]2.增加页面时间范围必填条件[改动很小,执行耗时略长,与数据量有关][比如默认查询创建时间最近一个月的数据根据数据量做调整,创建时间有组合索引]这两种......
  • ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排
    作者:庄宇什么是 Fan-outFan-in在工作流编排过程中,为了加快大任务处理的效率,可以使用Fan-outFan-in任务编排,将大任务分解成小任务,然后并行运行小任务,最后聚合结果。由上图,可以使用DAG(有向无环图)编排Fan-outFan-in任务,子任务的拆分方式分为静态和动态,分别对应静态DAG......
  • [ Go] GoRoutines and Channels
    AgoroutineistheGowayofsuingthreads,weopenagoroutinejustbyinvokinganyfunctionwithagoprefix.gofunctionCall()Goroutinescancommunicatethroughchannels,anspecialtypeofvariable,achannelcontainsavalueofanykind,aroutinec......
  • Typora PicGo SM
    TyporaPicGoSM.MS图床设置在程序猿的世界中,只有输出,不断输出才能成为自己在工作中的源头活水,因此在工作中,不断的记录遇到的问题和解决的思路和过程,对于锤炼思考有着十分重要的过程。文章写作作为文笔输出的重要部分,因此在工作生涯中扮演者举足轻重的作用。本文介绍了使用Typora......
  • GO镜像
    UNIX#启用GoModules功能goenv-wGO111MODULE=on#配置GOPROXY环境变量,以下三选一#1.七牛CDNgoenv-wGOPROXY=https://goproxy.cn,direct#2.阿里云goenv-wGOPROXY=https://mirrors.aliyun.com/goproxy/,direct#3.官方goenv-wGOPROXY=https:......
  • 解决golang依赖库被删库问题
    调用的开源库引用了github个人仓库,如果作者删除了仓库或者改成私人仓库,那么gomodtidy就会失败以github.com/mitchellh/osext为例,作者因为某些原因删除了仓库,并给出了替代的官方仓库github.com/kardianos/osext使用replace命令gomodedit-replace[oldgitpackage]@[versi......