Golang 每日一题:sync包

科技   2024-10-29 16:18   广东  

答案

sync.WaitGroup是Go语言中用于等待一组goroutine完成的同步机制。它提供了一种简单的方法来确保主goroutine等待所有其他goroutine完成执行后再继续。

工作原理:

  1. Add(delta int): 增加WaitGroup的计数器。delta可以是正数、负数或零。通常在启动新的goroutine之前调用Add

  2. Done(): 减少WaitGroup的计数器。通常在goroutine执行结束时调用。

  3. Wait(): 阻塞直到WaitGroup的计数器变为零。通常在主goroutine中调用,确保所有goroutine完成后再继续执行。

使用示例:

package main

import (
 "fmt"
 "sync"
 "time"
)

func worker(id int, wg *sync.WaitGroup) {
 defer wg.Done()
 fmt.Printf("Worker %d starting\n", id)
 time.Sleep(time.Second)
 fmt.Printf("Worker %d done\n", id)
}

func main() {
 var wg sync.WaitGroup

 for i := 1; i <= 3; i++ {
  wg.Add(1)
  go worker(i, &wg)
 }

 wg.Wait()
 fmt.Println("All workers done")
}

常见错误:

  1. 忘记调用Done(): 如果在goroutine中忘记调用Done(),会导致Wait()永远阻塞。

  2. 不正确的Add()调用: 在启动goroutine之后调用Add()可能导致计数错误,应该在启动goroutine之前调用。

  3. 使用值传递WaitGroup: WaitGroup应通过指针传递,否则每个goroutine会有自己的副本,导致计数错误。

开放性后续问题:

如果我们需要在程序中处理错误或者超时,该如何扩展sync.WaitGroup的使用?请描述一种实现策略。

评分标准:

  1. 基础理解: 候选人能够正确解释sync.WaitGroup的基本概念和方法。

  2. 代码示例: 提供的代码示例能够正确演示sync.WaitGroup的使用,并且没有明显错误。

  3. 错误识别: 能够识别并解释常见的使用错误。

  4. 进阶思考: 能够提出合理的扩展策略,如处理错误或超时的方案。

  5. 沟通能力: 能够清晰地表达思路和解释代码逻辑。

源自开发者
专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。
 最新文章