溫馨提示×

Golang如何在Linux上實現并發編程

小樊
53
2025-06-05 00:36:47
欄目: 編程語言

在Go語言(Golang)中,實現并發編程主要依賴于兩個關鍵特性:goroutines和channels。以下是如何在Linux上使用這兩個特性來實現并發編程的簡要指南。

1. Goroutines

Goroutines是Go語言中的輕量級線程,由Go運行時管理。它們比傳統的操作系統線程更輕量級,可以輕松創建成千上萬個。

創建Goroutine

要創建一個goroutine,只需在函數調用前加上關鍵字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來執行printNumbers函數
    time.Sleep(6 * time.Second) // 主goroutine等待6秒,以確保子goroutine有足夠的時間完成
}

2. Channels

Channels是Go語言中用于在goroutines之間進行通信和同步的原語。它們提供了一種安全的方式來傳遞數據,避免了競態條件。

創建和使用Channel

package main

import (
    "fmt"
)

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // 將結果發送到channel
    close(c) // 關閉channel
}

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

    c := make(chan int) // 創建一個int類型的channel

    go sum(s[:len(s)/2], c) // 啟動一個goroutine來計算數組的前半部分和
    go sum(s[len(s)/2:], c) // 啟動另一個goroutine來計算數組的后半部分和

    x, y := <-c, <-c // 從channel接收兩個結果

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

3. 同步

除了使用channels進行通信外,Go還提供了其他同步機制,如sync.WaitGroupsync.Mutex。

使用sync.WaitGroup

sync.WaitGroup用于等待一組goroutines完成。

package main

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

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // 在函數結束時調用Done()來通知WaitGroup該goroutine已完成

    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    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完成
}

使用sync.Mutex

sync.Mutex用于保護共享資源,防止多個goroutines同時訪問。

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
)

func increment() {
    mutex.Lock()         // 加鎖
    counter++            // 修改共享變量
    mutex.Unlock()       // 解鎖
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }

    wg.Wait()
    fmt.Println("Counter:", counter)
}

通過結合使用goroutines、channels和同步原語,你可以在Linux上輕松實現高效的并發編程。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女