golang并发
在Golang中,并发可以通过几种方式实现,包括goroutines、channels和sync包。以下是一个简单的例子,展示了如何使用goroutines和channels来实现并发。
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup, c chan string) {
defer wg.Done() // 在函数退出时通知WaitGroup一个goroutine已经结束
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second) // 模拟工作
c <- fmt.Sprintf("Worker %d done", id) // 将结果发送到channel
}
func main() {
var wg sync.WaitGroup
c := make(chan string) // 创建一个无缓冲的channel
for i := 1; i <= 5; i++ {
wg.Add(1) // 为每个goroutine增加一个计数
go worker(i, &wg, c) // 启动goroutine
}
go func() {
wg.Wait() // 等待所有goroutine完成
close(c) // 关闭channel
}()
// 接收channel并打印结果
for result := range c {
fmt.Println(result)
}
}
这段代码定义了一个worker
函数,它会在一个goroutine中执行。main
函数创建了一个channel和一个sync.WaitGroup
,后者用于等待所有goroutines完成。每个worker在工作完成后,将一个结果发送到channel,然后退出。主goroutine中的wg.Wait()
确保了程序在所有worker完成前不会退出。当所有worker都执行完毕并发送了结果之后,通过close(c)
关闭channel,结束range循环,程序继续执行后面的代码。
评论已关闭