Go中同时使用并发和并行编程的案例分析

go 同时支持并发 (通过 goroutine) 和并行 (通过协程) 以提升效率。goroutine 允许同时执行独立任务,而通道则实现 goroutine 之间的通信。该示例演示了如何使用并发和并行计算质数,提高计算效率。

Go中同时使用并发和并行编程的案例分析

使用 Go 进行并发和并行编程

Go 在支持并发和并行编程方面非常强大。并发允许应用程序同时执行多个独立任务,而并行则允许在多核系统上同时执行单个任务的不同部分。

goroutine

Go 中的并发是以 goroutine 的形式实现的。goroutine 是极其轻量级的用户级线程,可以通过 go 关键字创建。它们可以同时执行,并且共享相同的内存空间。

通道

为了在 goroutine 之间进行通信,可以使用通道。通道是用于在并发上下文中安全地传递值的类型。它们通过 make(chan T) 创建,其中 T 是要传递的值的类型。

实战案例

以下是一个使用并发和并行计算质数的示例:

package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    start := time.Now()

    numWorkers := runtime.NumCPU()
    jobs := make(chan int, numWorkers)
    results := make(chan int, numWorkers)

    // 使用通道并发创建多个goroutine
    for i := 0; i < numWorkers; i++ {
        go worker(i, jobs, results)
    }

    // 生成数字通道
    go func() {
        for i := 2; i < 1000000; i++ {
            jobs <- i
        }
        close(jobs)
    }()

    // 从结果通道收集质数
    var primes []int
    for i := 0; i < 1000000; i++ {
        result := <-results
        if result != 0 {
            primes = append(primes, result)
        }
    }

    fmt.Println("Number of primes found:", len(primes))
    fmt.Println("Time taken:", time.Since(start))
}

func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        result := 0
        if isPrime(job) {
            result = job
        }
        results <- result
    }
}

func isPrime(x int) bool {
    for i := 2; i*i <= x; i++ {
        if x%i == 0 {
            return false
        }
    }
    return true
}

此示例使用 goroutine 并发地检查数字是否是质数,并使用 通道 在它们之间进行通信。NumCPU 函数用于确定可用 CPU 的数量,以创建适当数量的工人群程。

这段代码运行后,将打印找到的质数的数量和计算所需的时间。此示例演示了如何使用 Go 的并发和并行功能来提高计算效率。

以上就是Go中同时使用并发和并行编程的案例分析的详细内容,更多请关注www.sxiaw.com其它相关文章!