溫馨提示×

Golang在Linux中的并發編程如何實現

小樊
45
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女