Golang 并发 生产者消费者模式
warning:
这篇文章距离上次修改已过190天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
type Job struct {
ID int
}
func (j Job) DoSomething() {
// 模拟耗时操作
time.Sleep(100 * time.Millisecond)
}
func main() {
var (
jobs = make(chan Job, 10)
wg sync.WaitGroup
consumed uint64 // 统计消费的任务数
)
// 启动3个工人
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for job := range jobs {
job.DoSomething()
atomic.AddUint64(&consumed, 1)
}
}()
}
// 生产一些任务
for i := 0; i < 10; i++ {
jobs <- Job{ID: i}
}
close(jobs) // 关闭任务通道,通知消费者所有任务已发送
wg.Wait() // 等待所有消费者完成
fmt.Printf("Total jobs consumed: %d\n", consumed)
}
这段代码使用了Go语言的通道(channel)来实现一个简单的生产者-消费者模型。代码中定义了一个Job
类型,并且每个Job
可以执行DoSomething
方法来模拟耗时操作。代码启动了3个goroutine作为消费者,它们不断从通道中获取任务并执行。主goroutine负责生产任务并发送到通道,然后关闭通道通知消费者所有任务已发送完毕。代码使用了sync.WaitGroup
来等待所有消费者完成工作,并使用atomic.AddUint64
来原子性地增加消费的任务数计数。
评论已关闭