当前位置:

首页 > 编程开发 > Linux Golang如何进行并发控制

Linux Golang如何进行并发控制

Go语言并发控制基于goroutine和channel,常用同步原语包括sync.WaitGroup等待任务完成、sync.Mutex互斥锁保护共享资源、sync.RWMutex读写锁优化读多写少、sync.Cond条件变量协调条件触发。使用中需谨慎避免死锁和竞态条件,并利用channel与select实现多路复用,配合context实现超时取消与上下文传递

本文目录

    在Golang的并发编程世界里,goroutines和channels是两大基石。goroutines可以看作是轻量级的线程,让你在同一程序里同时跑多个任务;而channels则负责在它们之间传递数据、同步操作。说白了,这就是Go语言为并发准备的“乐高积木”。

    Linux Golang如何进行并发控制

    那么,具体怎么玩转并发控制?下面这几种方法,基本覆盖了日常开发中最常见的场景:

    1. 用sync.WaitGroup等待一组goroutines收工——相当于给所有并发任务发一个“集合号”,等它们都跑完了再继续往下走。
    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                fmt.Printf("Goroutine %d\n", i)
            }(i)
        }
        wg.Wait()
        fmt.Println("All goroutines finished")
    }
    
    1. 用sync.Mutex实现互斥锁——当多个goroutines要同时修改一个共享变量时,就得靠它来“排好队,一个一个来”,防止数据打架。
    package main
    
    import (
        "fmt"
        "sync"
    )
    
    var counter int
    var mutex sync.Mutex
    
    func increment() {
        mutex.Lock()
        defer mutex.Unlock()
        counter++
    }
    
    func main() {
        wg := sync.WaitGroup{}
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func() {
                defer wg.Done()
                increment()
            }()
        }
        wg.Wait()
        fmt.Println("Counter:", counter)
    }
    
    1. 用sync.RWMutex实现读写锁——读多写少的场景下,这个锁更高效:允许同时多个goroutines读数据,但写的时候必须独占,谁也别来打扰。
    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var data map[string]string
    var rwMutex sync.RWMutex
    
    func readData(key string) {
        rwMutex.RLock()
        defer rwMutex.RUnlock()
        value := data[key]
        fmt.Printf("Read %s: %s\n", key, value)
    }
    
    func writeData(key, value string) {
        rwMutex.Lock()
        defer rwMutex.Unlock()
        data[key] = value
        fmt.Printf("Write %s: %s\n", key, value)
    }
    
    func main() {
        data = make(map[string]string)
        wg := sync.WaitGroup{}
        wg.Add(1)
        go func() {
            defer wg.Done()
            writeData("key1", "value1")
        }()
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                key := fmt.Sprintf("key%d", i)
                readData(key)
            }(i)
        }
        wg.Wait()
    }
    
    1. 用sync.Cond实现条件变量——当某个条件不满足时,让goroutines“先睡一觉”,等条件成熟了再统一唤醒。典型的生产者-消费者模式就常用这个。
    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var cond = sync.NewCond(&sync.Mutex{})
    var ready bool
    
    func worker(id int) {
        cond.L.Lock()
        for !ready {
            cond.Wait()
        }
        fmt.Printf("Worker %d started\n", id)
        cond.L.Unlock()
    }
    
    func main() {
        for i := 0; i < 5; i++ {
            go worker(i)
        }
        time.Sleep(1 * time.Second)
        cond.L.Lock()
        ready = true
        cond.Broadcast()
        cond.L.Unlock()
        time.Sleep(1 * time.Second)
    }
    

    以上四种方法,基本能应对Golang并发编程中绝大多数场景。选择哪种,取决于你的具体需求——是等待任务完成、保护共享资源、还是协调条件触发。记住一点:用锁和同步原语时,一定要小心谨慎,避免死锁和竞态条件。毕竟,并发虽好,翻车也快。?

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Linux
    相关文章 更多
    linux删除用户与用户组的方法及命令教程
    linux删除用户与用户组的方法及命令教程

    掌握Linux中删除用户和用户组的正确方法,避免残留文件和进程冲突。本文深入解析userdel和groupdel命令的参数用法,提供处理“用户仍在使用”等常见错误的实战方案。

    Linux如何开启端口号?开放端口命令详解
    Linux如何开启端口号?开放端口命令详解

    详细讲解Linux如何开启端口号以及常用的开放端口命令。

    crossover卸载软件下载及重新安装教程
    crossover卸载软件下载及重新安装教程

    遇到CrossOver运行错误或需要更新版本时,如何彻底卸载旧版并干净重装?本教程详解macOS和Linux下的卸载步骤、残留文件清理方法及官方下载渠道,确保软件环境纯净稳定。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。