Golang 并发、并行和协程
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
// 初始化runtime的逻辑CPU核心数
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
}
// 协程函数,用于打印信息并等待一段时间
func printWithDelay(msg string, delay time.Duration, wg *sync.WaitGroup) {
defer wg.Done() // 确保每次调用后计数器减一
fmt.Println(msg)
time.Sleep(delay) // 等待一段时间
}
func main() {
var wg sync.WaitGroup
start := time.Now()
// 启动三个并发的协程
for i := 1; i <= 3; i++ {
wg.Add(1) // 为每个协程任务增加计数器
go printWithDelay(fmt.Sprintf("Go Routine %d", i), time.Duration(i)*time.Second, &wg)
}
// 等待所有协程任务完成
wg.Wait()
elapsed := time.Since(start)
fmt.Printf("Total time taken: %.3fs\n", elapsed.Seconds())
}
这段代码设置了Go语言的逻辑CPU核心数为系统的核心数,然后启动了三个并发的goroutine,每个goroutine分别打印一条消息并等待一段时间。使用sync.WaitGroup来等待所有的goroutine完成。最后,代码计算了所有goroutine任务完成所需的总时间。这是一个典型的并发处理的例子,适合学习并发编程的初学者。
评论已关闭