Go中同时使用并发和并行编程的案例分析
go 同时支持并发 (通过 goroutine) 和并行 (通过协程) 以提升效率。goroutine 允许同时执行独立任务,而通道则实现 goroutine 之间的通信。该示例演示了如何使用并发和并行计算质数,提高计算效率。
使用 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中同时使用并发和并行编程的案例分析的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341