在CentOS上使用Go语言实现并发编程

想在CentOS系统里玩转Go语言的并发编程?这事儿其实没想象中那么复杂。Go语言自带的并发模型——也就是Goroutines和Channels——设计得非常精妙,用起来既高效又直观。下面咱们就一步步来,看看怎么在CentOS上搭建环境并写出你的第一个并发程序。

1. 安装Go语言环境

第一步,当然是得先把Go语言环境给装上。如果你的CentOS系统里还没有,跟着下面这几行命令走就行:

# 下载Go语言安装包
wget https://golang.org/dl/go1.20.4.linux-amd64.tar.gz
# 解压安装包到/usr/local目录
sudo tar -C /usr/local -xzf go1.20.4.linux-amd64.tar.gz
# 配置环境变量
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc
# 验证安装
go version

跑完最后一句go version,如果能看到版本号蹦出来,那就恭喜你,环境搞定了一半。

2. 创建Go项目

环境好了,接下来得有个地方写代码。创建一个专属的项目目录,并且初始化Go模块,这样管理依赖会方便很多:

mkdir myconcurrencyproject
cd myconcurrencyproject
go mod init myconcurrencyproject

3. 编写并发程序

重头戏来了。在项目里创建一个main.go文件,然后把下面的代码贴进去。这个例子展示了如何使用Goroutines和WaitGroup来并发执行多个“工人”任务:

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

    // 启动多个Goroutines
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    // 等待所有Goroutines完成
    wg.Wait()
    fmt.Println("All workers done")
}

4. 运行程序

代码写好了,跑起来看看效果。在终端里输入:

go run main.go

你会看到五个“工人”几乎同时开始工作,又在一秒后陆续完成任务,最后主程序收到“全部完成”的信号。这就是并发最直观的体现。

解释

这里用到了两个核心概念:

5. 使用Channels进行通信

光能同时跑任务还不够,任务之间还得能“对话”。这就是Channel的用武之地了,它是Goroutines之间通信和同步的桥梁。再看一个生产者和消费者的例子:

package main

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

func producer(ch chan<- int) {
    for i := 1; i <= 5; i++ {
        ch <- i
        time.Sleep(time.Second)
    }
    close(ch)
}

func consumer(ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for num := range ch {
        fmt.Printf("Received: %d\n", num)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup
    wg.Add(2)

    go producer(ch)
    go consumer(ch, &wg)

    wg.Wait()
    fmt.Println("Done")
}

解释

这段代码又引入了新玩法:

走完这几个步骤,你应该就能在CentOS上轻松驾驭Go的并发编程了。Go的这套并发模型,强大就强大在它把复杂的并发控制抽象成了几个简单易懂的原语,用起来顺手,效率也高,非常适合处理各种需要并发的场景。

本文转载于:https://www.yisu.com/ask/4400588.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。