linux

Golang在Linux中的并发编程如何实现

小樊
47
2025-08-19 12:35:02
栏目: 编程语言

在Golang中,实现Linux中的并发编程主要依赖于Go的并发原语,如goroutines和channels。以下是一些关于如何在Linux中使用Golang进行并发编程的基本步骤和示例:

1. 启动一个goroutine

Goroutines是Go语言中的轻量级线程,可以轻松地启动成千上万个。

package main

import (
    "fmt"
    "time"
)

func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Printf("Number: %d\n", i)
        time.Sleep(1 * time.Second)
    }
}

func main() {
    go printNumbers() // 启动一个新的goroutine
    time.Sleep(6 * time.Second) // 等待足够的时间让goroutine完成
}

2. 使用channels进行通信

Channels是goroutines之间通信和同步的主要方式。

package main

import (
    "fmt"
)

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // 将结果发送到channel
    close(c)
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)

    x, y := <-c, <-c // 从channel接收结果

    fmt.Println(x, y, x+y)
}

3. 使用sync包进行同步

sync包提供了一些工具来帮助管理goroutines之间的同步,例如WaitGroup

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // 在函数结束时调用Done()
    fmt.Printf("Worker %d starting\n", id)
    // 模拟工作
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1) // 增加WaitGroup的计数器
        go worker(i, &wg)
    }

    wg.Wait() // 等待所有goroutines完成
}

4. 使用context包进行超时和取消操作

context包可以用来传递截止时间、取消信号和其他请求范围的值。

package main

import (
    "context"
    "fmt"
    "time"
)

func doSomething(ctx context.Context) {
    select {
    case <-time.After(2 * time.Second):
        fmt.Println("Done")
    case <-ctx.Done():
        fmt.Println("Cancelled")
    }
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    defer cancel()

    go doSomething(ctx)
    time.Sleep(3 * time.Second) // 等待足够的时间观察结果
}

总结

通过使用goroutines、channels、sync包和context包,你可以在Linux环境中轻松地实现高效的并发编程。这些工具提供了强大的机制来管理并发任务、同步数据和处理超时及取消操作。

0
看了该问题的人还看了