当前位置: 首页 > news >正文

旅游短租公寓网站建设网站流量统计工具有哪些

旅游短租公寓网站建设,网站流量统计工具有哪些,医疗保健网站前置审批文件,西安模板建站网站协程并发等待技术——WaitGroup 类型和 errgroup 包 waitgroup 阻塞等待多个并发任务执行完成。WaitGroup 类型主要包含下面几个方法。 func (wg *WaitGroup) Add(delta int) func (wg *WaitGroup) Done() func (wg *WaitGroup) Wait() 第一个是 Add 方法,在任务运…

协程并发等待技术——WaitGroup 类型和 errgroup 包

waitgroup 

阻塞等待多个并发任务执行完成。WaitGroup 类型主要包含下面几个方法。

func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()

第一个是 Add 方法,在任务运行之前,需要调用 Add 方法,用于设置需要等待完成的任务数,Add 方法传进去的数值之和,需要和任务数相等。

第二个是 Done 方法,每个任务完成时,需要调用 Done 方法,用于告知 WaitGroup 对象已经有一个任务运行完成。

第三个是 Wait 方法,当需要等待所有并发任务完成时,调用 Wait 方法,用于阻塞主协程。

 

import ("sync"
)var urls = []string{"http://www.golang.org/","http://www.google.com/","http://www.somestupidname.com/",
}func TestWaitGroup(t *testing.T) {// 创建WaitGroupwg := sync.WaitGroup{}results := make([]string, len(urls))for index, url := range urls {url := urlindex := index// 在创建协程执行任务之前,调用Add方法wg.Add(1)go func() {// 任务完成后,调用Done方法defer wg.Done()// Fetch the URL.resp, err := http.Get(url)if err != nil {return}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return}results[index] = string(body)}()}// 主协程阻塞,等待所有的任务执行完成wg.Wait()
}

errgroup 包

可以在主协程中获取并发任务错误信息 

import ("golang.org/x/sync/errgroup"
)func TestErrHandle(t *testing.T) {results := make([]string, len(urls))// 创建Group类型g := new(errgroup.Group)for index, url := range urls {// Launch a goroutine to fetch the URL.url := urlindex := index// 调用Go方法g.Go(func() error {// Fetch the URL.resp, err := http.Get(url)if err != nil {return err // 返回错误}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return err // 返回错误}results[index] = string(body)return nil})}// Wait for all HTTP fetches to complete.// 等待所有任务执行完成,并对错误进行处理if err := g.Wait(); err != nil {fmt.Println("Failured fetched all URLs.")}
}

 第一步,我们要创建 Group 类型的对象。

第二步,在 Group 的 Go 方法中传入那些需要并发运行的函数。特别需要注意的是,这些传入的函数必须将错误返回。

第三步,也是最后一步,在主协程中,我们需要调用 Group 对象的 Wait 方法。通过这一调用,主协程将会阻塞等待,直至所有通过 Go 方法传入的任务都执行完毕。并且,在任务完成后,我们还能够对 Wait 方法所返回的错误进行处理。

func TestLimitGNum(t *testing.T) {results := make([]string, len(urls))// 用WithContext函数创建Group对象eg, ctx := errgroup.WithContext(context.Background())// 调用SetLimit方法,设置可同时运行的最大协程数eg.SetLimit(2)for index, url := range urls {url := urlindex := index// 调用Go方法eg.Go(func() error {select {case <-ctx.Done(): // select-done模式取消运行return errors.New("task is cancelled")default:// 并发获取urlresp, err := http.Get(url)if err != nil {return err // 返回错误}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return err // 返回错误}results[index] = string(body)return nil}})}// 等待所有任务执行完成,并对错误进行处理if err := eg.Wait(); err != nil {fmt.Println("Failured fetched all URLs.")}
}

 errorGroup 包中的结构体

type token struct{}type Group struct {cancel func(error) // 这个作用是為了前面說的 WithContext 而來的wg sync.WaitGroup // errGroup底层的阻塞等待功能,就是通过WaitGroup实现的sem chan token // 用于控制最大运行的协程数err     error // 最后在Wait方法中返回的errorerrOnce sync.Once // 用于安全的设置err
}

总结:

1. WaitGroup类型是Golang的基础并发类型,用于阻塞等待多个并发任务执行完成,包含Add、Done和Wait方法。

2. errgroup包是Golang提供的并发扩展库,对WaitGroup进行了封装,在并发等待的基础功能上提供了错误处理和任务取消功能。

3. Group类型的Go方法用于传入具有错误返回值的函数类型,Wait方法会阻塞等待所有传入Go方法的函数全部运行完毕,并且在任务完成后能够对错误进行处理。

4. 任务取消功能通过WithContext函数创建Group对象,传入Go方法的函数需要实现select-done模式,利用context来停止所有相关任务。

5. errgroup包还可以限制同时并发运行的最大协程数,通过SetLimit方法设置可同时运行的最大协程数,达到最大协程数时会阻塞创建新协程运行任务。

http://www.hkea.cn/news/555066/

相关文章:

  • 专业的营销网站建设公司百度联盟注册
  • 机械类网站用什么做背景指数运算法则
  • 微信如何绑定网站加速游戏流畅的软件
  • 茂名整站优化百度问答首页
  • 手机网站搭建网络宣传方式
  • 2003网站建设网站seo哪家公司好
  • 成都学校网站制作2022年国际十大新闻
  • 工厂外贸网站建设台州网络推广
  • 酒店网站建设方案策划百度seo怎么做网站内容优化
  • 网站更改公司需要重新备案吗搜索网页内容
  • 现在做网站还用dw做模板了吗成人电脑速成培训班
  • 做app要不要建网站刚开的店铺怎么做推广
  • 做生存分析的网站有哪些专业的网站优化公司
  • 网站双倍浮动百度联盟app
  • 北京网站设计确保代码符合w3c广州网络营销的推广
  • 做网站实名认证有什么用百度移动端模拟点击排名
  • 知更鸟wordpress 怎样沈阳百度seo关键词优化排名
  • 携程网站模板互联网营销策略有哪些
  • 做网站内链什么意思上海排名优化seobwyseo
  • 四川做直销会员网站百度网盘帐号登录入口
  • 做百度竞价对网站有无要求网站推广排名服务
  • 建设工程合同包括成都网站改版优化
  • 深圳不加班的互联网公司整站seo优化
  • 中国做的很好的食品网站肇庆疫情最新消息
  • 做时时彩网站微信seo关键词有话要多少钱
  • 陇南市建设局网站商务软文写作
  • 做学术研究的网站营销方案怎么写?
  • 专业网站设计公司有哪些秒收录关键词代发
  • 织梦网站模板源码下载真实有效的优化排名
  • 网站建设过程中什么最重要磁力链bt磁力天堂