Golang中的sync.WaitGroup用法实例
作者:junjie 发布时间:2023-08-31 03:57:28
标签:Golang,sync.WaitGroup
WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
官方对它的说明如下:
A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished.
sync.WaitGroup只有3个方法,Add(),Done(),Wait()。
其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
例子代码如下:
同时开三个协程去请求网页, 等三个请求都完成后才继续 Wait 之后的工作。
var wg sync.WaitGroup
var urls = []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for _, url := range urls {
// Increment the WaitGroup counter.
wg.Add(1)
// Launch a goroutine to fetch the URL.
go func(url string) {
// Decrement the counter when the goroutine completes.
defer wg.Done()
// Fetch the URL.
http.Get(url)
}(url)
}
// Wait for all HTTP fetches to complete.
wg.Wait()
或者下面的测试代码
用于测试 给chan发送 1千万次,并接受1千万次的性能。
package main
import (
"fmt"
"sync"
"time"
)
const (
num = 10000000
)
func main() {
TestFunc("testchan", TestChan)
}
func TestFunc(name string, f func()) {
st := time.Now().UnixNano()
f()
fmt.Printf("task %s cost %d \r\n", name, (time.Now().UnixNano()-st)/int64(time.Millisecond))
}
func TestChan() {
var wg sync.WaitGroup
c := make(chan string)
wg.Add(1)
go func() {
for _ = range c {
}
wg.Done()
}()
for i := 0; i < num; i++ {
c <- "123"
}
close(c)
wg.Wait()
}


猜你喜欢
- 一、异步解决方案的进化史JavaScript的异步操作一直是个麻烦事,所以不断有人提出它的各种解决方案。可以追溯到最早的回调函数(ajax老
- 下面是一段产生log-normal分布的代码,以此进行说明。clear all;clc;for t=1:100 Traffic(t) =cu
- Event Handler在HDA中,要创建Python脚本,需要先选择一个事件处理器(EventHandle),他表示你要在什么时候执行你
- 实例一:无参的存储过程$conn = mysql_connect('localhost','root',
- 前言当我们编写任何程序时,都会遇到一些错误,会让我们有挫败感,所以我有一个解决方案给你。 今天在这篇文章中,我们将讨论错误类型error:
- 在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简
- 网上商城数据库-用户信息数据操作项目描述在电子商务兴起的大环境下,建立利用互联网开拓销售渠道,帮助企业及时调整商品结构,协助经销商打开货源的
- pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:class torch.nn.Conv2d(in_channels, o
- 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来。看起来是非常高端,但是实际实现起来确是非常简单,我们只需要
- 基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(1) Python的语法清晰;(2) 易于操作纯文本文件;(3) 使
- 1、控制"纵打"、 横打”和“页面的边距。 (1)<script defer> function SetPr
- 1.URLError首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 &
- 前言我是一个半路出家的PHP程序员,到目前为止,不算在培训班学习的时间,已经写代码整整两年了。可能由于工作业务的原因,在这两年中我没有用到过
- 什么是recovery?在elasticsearch中,recovery指的是一个索引的分片分配到另外一个节点的过程,一般在快照恢复、索引复
- 使用tkFileDialog实现文件选择、保存和路径选择概述看了下Tkinter的文档,对于Pop-up dialog有三类,现在用到的是t
- 一、Scrapy是什么Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间的耦
- 本文实例讲述了Python自动登录126邮箱的方法。分享给大家供大家参考。具体实现方法如下:import sys, urllib2, url
- 代码实现:<!DOCTYPE html><html lang="en"><head>
- 最近需要各种转格式,这里对相关代码作一个记录,方便日后查询。xlsx文件转csv文件import xlrdimport csvdef xls
- 因此,我们主要解决的思路是效验session ID的有效性. 以下为引用的内容: <?php if(!isset($_SESSION[