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")
}

最新文章

  1. Java Servlet+Objective-c图上传 步骤详细
  2. C#之委托与事件
  3. 解决Oracle SQL Developer无法连接远程服务器的问题
  4. c语言数据结构之 插入排序
  5. 跨境B2B网站
  6. 调试记录:The public type <<classname>> must be defined in its own file
  7. HDU 4405 (概率DP)
  8. git server服务器搭建
  9. mysql查看被锁住的表,正在进行的进程,已经杀掉进程的方法
  10. highcharts 柱形图 饼图 加URL或Click事件
  11. Ultraedit中使用Astyle格式化代码
  12. 优化SQL
  13. UVA127- "Accordian" Patience(模拟链表)
  14. 利用Javamail接收QQ邮箱和Gmail邮箱(转)
  15. win10快捷键大全
  16. C语言之scanf
  17. form表单序列化为Jquery对象
  18. 用C语言做一个横板过关类型的控制台游戏
  19. javascript的ES6学习总结(第二部分)
  20. select top 1 和select top 1 with ties * from SC 的区别

热门文章

  1. java 将yyyyMMddHHmmss转化为yyyy-MM-dd HH:mm:ss格式的字符串
  2. 正则过滤http|https地址
  3. python备份文件(简易)
  4. VSCode 修改终端显示字体 字体间隔过大
  5. vue3 门户网站搭建3-pinia
  6. Access 时间查询 与 SQL SERVER 不一样的几个地方
  7. jekins 入门
  8. 《这里分别闭合离合器Zm和Z2会分别有什么效果》 回复
  9. [转载] MATLAB | RGB image representation
  10. Vue + Element table中的某行触发enter事件后,使该行disabled