golangsyncwait

admin 2026-01-26 09:41:13 编程 来源:ZONE.CI 全球网 0 阅读模式

使用golang sync.WaitGroup实现并发控制

在golang中,sync.WaitGroup是一个非常有用的工具,它可以用来控制并发执行的goroutine。当我们需要等待一组goroutine完成后再继续执行其他操作时,sync.WaitGroup就派上了用场。

首先,让我们了解一下sync.WaitGroup的基本用法。

基本用法

要使用sync.WaitGroup,我们首先需要创建一个WaitGroup对象:

var wg sync.WaitGroup

然后,我们可以通过调用Add方法来增加等待的goroutine数量:

wg.Add(1)

接下来,我们在每个goroutine的结尾调用Done方法来通知WaitGroup一个goroutine已经完成:

go func() {
    defer wg.Done()
    // 执行具体的任务
}()

最后,我们可以通过调用Wait方法来等待所有的goroutine完成:

wg.Wait()

并发控制示例

假设我们有一个需求,需要从多个URL下载图片并保存到本地。我们希望能够同时下载多张图片,但是希望只有所有的图片都下载完毕后才继续执行后面的逻辑。

package main

import (
    "io"
    "net/http"
    "os"
    "sync"
)

func main() {
    urls := []string{
        "https://example.com/1.jpg",
        "https://example.com/2.jpg",
        "https://example.com/3.jpg",
    }

    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            resp, err := http.Get(url)
            if err != nil {
                // 处理错误
                return
            }
            defer resp.Body.Close()

            file, err := os.Create(url[strings.LastIndex(url, "/")+1:])
            if err != nil {
                // 处理错误
                return
            }
            defer file.Close()

            _, err = io.Copy(file, resp.Body)
            if err != nil {
                // 处理错误
                return
            }
        }(url)
    }

    wg.Wait()

    // 所有图片已经下载完毕,可以继续执行后面的逻辑
}

在上面的示例中,我们创建了一个WaitGroup对象,并通过调用Add方法来增加等待的goroutine数量。然后,在每个goroutine下载图片完成后调用Done方法通知WaitGroup一个goroutine已经完成。最后,我们调用Wait方法等待所有的goroutine完成。

总结起来,sync.WaitGroup是golang中非常方便的并发控制工具,它可以帮助我们实现等待一组goroutine完成后再继续执行其他操作。通过合理使用sync.WaitGroup,我们可以更好地控制并发执行的goroutine,提高程序的性能和效率。

golang学习资料网盘 编程

golang学习资料网盘

作为一名专业的golang开发者,学习资料对于我们来说非常重要。它可以帮助我们深入了解golang的语法、标准库以及一些高级特性,提高我们的编码能力和解决问题的
golangsyncwait 编程

golangsyncwait

使用golang sync.WaitGroup实现并发控制在golang中,sync.WaitGroup是一个非常有用的工具,它可以用来控制并发执行的gorou
golang类型递归 编程

golang类型递归

Go是一门静态类型的编程语言,它以其简洁、高效和并发安全而受到广泛关注。作为一名专业的Go开发者,了解Golang的类型递归是至关重要的。在本文中,我将深入探讨
rust语言golang 编程

rust语言golang

H2: Rust语言与Golang的比较P: 在现代软件开发领域中,Rust语言和Golang (Go) 语言是备受关注的两个编程语言。这两者都在以其独特的方式
评论:0   参与:  0