golang wg

admin 2024-08-21 15:39:37 编程 来源:ZONE.CI 全球网 0 阅读模式

Go语言中的sync包提供了一系列用于并发控制的工具,其中最重要的之一就是WaitGroup。

WaitGroup的作用

在并发编程中,我们常常需要等待一组并发任务全部完成之后再继续执行后续的代码。传统的做法是使用锁或者信号量等机制进行手动同步。而WaitGroup的作用就是简化这个过程,它可以帮助我们等待一组goroutine的完成。

WaitGroup的基本用法

使用WaitGroup非常简单,它提供了三个主要方法:Add()、Done()和Wait()。

首先,我们需要创建一个WaitGroup对象:

var wg sync.WaitGroup

然后,在每个需要并发执行的任务前调用Add()方法增加WaitGroup的计数:

wg.Add(1)

在任务的结尾处调用Done()方法表示任务已完成:

wg.Done()

最后,使用Wait()方法阻塞主goroutine,直到所有任务都完成:

wg.Wait()

实例演示:并发下载文件

下面我们通过一个简单的实例演示如何使用WaitGroup实现并发下载文件的功能。

func download(url string, wg *sync.WaitGroup) {
    defer wg.Done()

    // 下载逻辑
    // ...
}

func main() {
    var wg sync.WaitGroup

    urls := []string{"url1", "url2", "url3"}

    for _, url := range urls {
        wg.Add(1)
        go download(url, &wg)
    }

    wg.Wait()

    fmt.Println("所有文件下载完成")
}

在这个例子中,我们定义了一个download函数来模拟文件的下载操作,每个下载任务执行完成后都会调用wg.Done()来通知WaitGroup。主函数中,我们将需要下载的文件URL放进一个切片中,然后使用for循环并发执行下载任务,并在每次下载任务前通过wg.Add(1)增加WaitGroup的计数。最后,我们使用wg.Wait()阻塞主goroutine,直到所有下载任务都完成。

WaitGroup的一些注意事项

在使用WaitGroup时,有一些需要特别注意的地方:

  1. WaitGroup不能被复制:WaitGroup应该被作为指针传递给goroutine,以避免复制产生的歧义。
  2. 确保调用Done()的次数与Add()的次数相等:如果Done()的次数大于Add()的次数,Wait()将永远阻塞。
  3. 不要在WaitGroup中使用锁:WaitGroup本身是线程安全的,不需要额外的互斥锁。

通过合理使用WaitGroup,我们可以轻松地实现并发任务的同步和等待。

TypeScript学习笔记 编程

TypeScript学习笔记

TypeScript学习笔记[TOC]TypeScript概述TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型
高德地图JSAPI学习笔记 编程

高德地图JSAPI学习笔记

[toc]概述地图 JS API 2.0 是高德开放平台免费提供的第四代 Web 地图渲染引擎, 以 WebGL 为主要绘图手段,本着“更轻、更快、更易用”的服
golangTCPpush 编程

golangTCPpush

在当今互联网时代,即时通讯成为了人们生活中不可或缺的一部分。而实现即时通讯的关键技术之一就是TCP Push。作为一名专业的golang开发者,我们不仅需要掌握
nodegolang性能对比 编程

nodegolang性能对比

在当前的编程世界中,Node.js和Golang是两种备受瞩目的技术。它们都拥有出色的性能和能力,但在某些方面却存在差异。本文将对Node.js和Golang进
评论:0   参与:  21