首頁 > 後端開發 > Golang > 主體

Golang協程與並發模型

WBOY
發布: 2024-04-15 14:21:01
原創
374 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!