首頁  >  文章  >  後端開發  >  Golang協程與並發模型

Golang協程與並發模型

WBOY
WBOY原創
2024-04-15 14:21:01401瀏覽

Go 中的協程是一種輕量級並發機制,允許在同一個進程中執行多個任務。它們共享進程記憶體空間,可以透過通道進行通訊。此外,文章還提供了以下內容:協程建立使用 go 關鍵字。通道透過 make 函數創建,可用於在協程之間傳遞值。實戰案例示範如何使用協程實現並行計算,透過 8 個協程計算 10 萬個質數。

Golang協程與並發模型

Go 協程與並發模型

引言

##協程是Go語言中一種輕量級的並發機制,允許在同一進程中執行多個獨立的任務。本文將探討 Go 中的協程和並發模型,並提供實戰案例。

協程

協程是 Go 語言中的並發執行單元,與執行緒類似,但更輕量級。協程共享同一個行程的記憶體空間,可以輕鬆共享資料。建立協程使用go 關鍵字,如下所示:

go func() {
    // 协程体
}

通道

通道是Go 中的一種通訊機制,用於在協程之間傳遞值。通道可以單向或雙向,並且可以緩衝或無緩衝。建立通道使用 make 函數,如下所示:

ch := make(chan int, 10)

實作案例:並行計算

讓我們使用協程實作並行計算的實戰案例。我們創建一個協程池,並在每個協程中計算一個大素數表:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

const primeCount = 100000

// 计算素数
func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

// 协程函数
func parallelPrimes(ch chan int) {
    for i := 0; i < primeCount; i++ {
        n := rand.Intn(100000)
        if isPrime(n) {
            ch <- n
        }
    }
}

func main() {
    // 创建通道和协程池
    ch := make(chan int, primeCount)
    for i := 0; i < 8; i++ {
        go parallelPrimes(ch)
    }

    // 等待协程池完成
    close(ch)

    start := time.Now()
    // 收集素数
    for prime := range ch {
        fmt.Println(prime)
    }
    elapsed := time.Since(start)
    fmt.Printf("Elapsed time: %v\n", elapsed)
}

在這個案例中,我們創建了8 個協程,每個協程負責計算10 萬個素數。主協程負責收集素數並將它們列印到控制台上。

以上是Golang協程與並發模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn