go语言sync包中的waitgroup和mutex是处理并发问题的核心工具。1.waitgroup用于等待一组goroutine完成任务,适用于批处理或初始化/清理场景,但无法跨进程或分布式系统使用,需借助消息队列、集中式协调服务等替代方案;2.mutex用于保护共享资源避免数据竞态,适合底层或高性能需求场景,但存在上下文切换、缓存失效和锁粒度过粗等性能开销,可通过rwmutex优化读写竞争。两者各司其职,分别解决并发协作与资源共享的关键问题。

Go语言的
sync
WaitGroup
Mutex
WaitGroup
Mutex

当我第一次接触Go的并发模型时,
sync

WaitGroup
Add
Done
Wait
立即学习“go语言免费学习笔记(深入)”;
package main
import (
    "fmt"
    "sync"
    "time"
)
func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // 确保无论如何都调用Done
    fmt.Printf("Worker %d 正在开始工作...\n", id)
    time.Sleep(time.Duration(id) * time.Second) // 模拟耗时操作
    fmt.Printf("Worker %d 完成了工作。\n", id)
}
func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 3; i++ {
        wg.Add(1) // 每启动一个goroutine,计数器加1
        go worker(i, &wg)
    }
    wg.Wait() // 等待所有goroutine完成
    fmt.Println("所有worker都已完成。")
}至于
Mutex
Mutex
Mutex
Lock()
Unlock()

package main
import (
    "fmt"
    "sync"
    "time"
)
var (
    counter int
    mutex   sync.Mutex
)
func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 100000; i++ {
        mutex.Lock() // 获取锁
        counter++
        mutex.Unlock() // 释放锁
    }
}
func main() {
    var wg sync.WaitGroup
    wg.Add(5) // 启动5个goroutine来增加计数器
    for i := 0; i < 5; i++ {
        go increment(&wg)
    }
    wg.Wait()
    fmt.Printf("最终计数器值: %d\n", counter) // 期望值是 5 * 100000 = 500000
}Mutex
Mutex
WaitGroup
WaitGroup
举个例子,如果你的一个服务启动了另一个服务来处理数据,并想知道对方什么时候处理完,你不能指望用
WaitGroup
另外,在Go语言内部,如果你的任务编排不仅仅是简单的等待,而是需要处理错误传播、上下文取消等更高级的特性,那么
errgroup
golang.org/x/sync/errgroup
WaitGroup
WaitGroup
Context
errgroup
Mutex
Mutex
Mutex
Mutex
那么,如何优化
Mutex
RWMutex
以上就是Golang的sync包有哪些并发原语 详解WaitGroup和Mutex使用场景的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号