首页 > 其他分享 >每日一抄 Go语言等待组

每日一抄 Go语言等待组

时间:2022-12-07 14:56:50浏览次数:37  
标签:wg WaitGroup 一抄 url 每日 计数 计数器 Go 等待

package main

import (
	"fmt"
	"net/http"
	"sync"
)

/*
Go语言除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步
,等待组可以保证在并发环境中完成指定数量的任务

在sync.WaitGroup(等待组)类型中,每个sync.WaitGroup值在内部维护着一个计数,此计数的初始默认值为零
等待组有下面几个方法可用:
(wg *WaitGroup) Add(delta int)// 等待组的计数器加一
(wg *WaitGroup) Done() //等待组的计数器减一
(wg *WaitGroup) Wait() //当等待组计数器不等于0时阻塞,直到变0


对于一个可寻址的sync.WaitGroup值wg:
1.我们可以使用方法调用调用wg.Add(delta)来改变值wg维护的计数
2.方法调用wg.Done()和wg.Add(-1)是完全等价的
3.如果一个wg.Add(delta)或者wg.Done()调用将wg维护的计数更改为一个负数,一个恐慌将产生
4.当一个协程调用了wg.Wait()时,
	如果此时wg维护的计数为零,则此wg.Wait()操作为一个空操作(noop)
	否则(计数为一个正整数),则此协程将进入阻塞状态。当以后其他某个协程将此计数更改至零时(一般通过调用wg.Done()),
此协程将重新进入运行状态(即 wg.Wait()将返回)。

等待组内部拥有一个计数器,计数器的值可以通过方法调用实现计数器的增加和减少。当我们添加了 N 个并发任务进行工作时,就将等待组的计数器值增加 N。每个任务完成时,这个值减 1。
同时,在另外一个 goroutine 中等待这个等待组的计数器值为 0 时,表示所有任务已经完成。
*/

func main() {
	//声明一个等待组
	var wg sync.WaitGroup
	//准备一系列的网站地址
	//字符串切片
	var urls = []string{
		"http://www.github.com/",
		"https://www.qiniu.com/",
		"https://www.golangtc.com/",
	}
	//遍历这些地址
	for _, url := range urls {
		//每个任务开始时,将等待组增加
		wg.Add(1)
		//开启一个并发
		//这里将 url 通过 goroutine 的参数进行传递,是为了避免 url 变量通过闭包放入匿名函数后又被修改的问题。
		go func(url string) {
			//使用defer,表示函数完成是将等待组的值减一
			defer wg.Done()
			//使用http访问提供的地址
			//使用 http 包提供的 Get() 函数对 url 进行访问,Get() 函数会一直阻塞直到网站响应或者超时。
			_, err := http.Get(url)
			//访问完成后,打印地址可能发生的错误
			if err != nil {
				fmt.Println(url, err)
			}
			fmt.Println("fangwen", url)
		}(url)
	}

	//等待所有任务完成
	wg.Wait()
	fmt.Println("over")
}

标签:wg,WaitGroup,一抄,url,每日,计数,计数器,Go,等待
From: https://www.cnblogs.com/jianjiana/p/16963059.html

相关文章

  • Go常见面试题【由浅入深】2022版
    Go语言相比C++/Java等语言是优雅且简洁的,是笔者最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Python优雅的调用三方库和管理项目,同时还有接口,自动垃圾回收和goro......
  • 一文掌握 Go 文件的写入操作
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,今天分享的知识是Go文件的写入操作。如果本文对你有帮助,不妨点个赞,如果你是Go语言初学者,不妨点个关注,一起成长一起进步......
  • Django--QuerySet
    一、QuerySetAPI数据库接口从数据库中查询出来的结果一般是一个集合,这个集合叫做QuerySet。1.QuerySet创建对象的方法:一共有四种方法方法1Author.objects.crea......
  • go 云资源Provider
    目录go云资源Provider效果演示脚本可以吗云资产提供商环境变量配置阿里云go云资源Provider设计注意事项:为了让cmdb服务无状态,因此cmdb服务自己并不做定时任务配置,......
  • windows mongo 开启副本集 6.x版本 mongo : 无法将“mongo”项识别为 cmdlet、函数
    mongo报错当前使用版本6.0.3,bin目录下并没有mongo.exe,所以没有mongo命令,需要下载 https://www.mongodb.com/try/download/shell 解压放到bin目录。ps:新版本的一些备......
  • 解码斯坦福开源狗DogGo——电机旋转角度的设置及解读
      以下分析基于这篇博客:​​解码斯坦福开源狗DogGo–附硬件清单、源码、图纸、论文​​  我选取其中的一幅图来分析  我以Y轴正方向为0度,逆时针为正。  考虑......
  • Java—Google guava工具类(高效)快速入门指南
    Java—Googleguava工具类(高效)快速入门指南Googleguava工具类特点Guava是对JavaAPI的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava......
  • Go的安装和环境配置
    最近准备学Go,和大家分享了一下我的安装配置方法Golang的安装官网地址:https://golang.google.cn/dl/如图:我这里选用的是使用标准包安装(Mac、Linux用户根据需求下载指定......
  • go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
    dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库Dongle已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/dong......
  • 一文掌握 Go 文件的读取操作
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,今天分享的知识是Go文件的读取操作。如果本文对你有帮助,不妨点个赞,如果你是Go语言初学者,不妨点个关注,一起成长一起进步......