Golang并发控制:利用通道和协程实现顺序消费数据
Golang并发控制:利用通道和协程实现顺序消费数据
在Golang并发编程中,我们经常需要控制多个协程对数据的访问顺序。本文将介绍如何使用通道和协程实现数据的顺序消费,确保只有在上一个协程完成消费后,下一个协程才能开始工作。
以下是示例代码:gopackage main
import ( 'fmt' 'sync')
func main() { dataChan := make(chan int) done := make(chan struct{}) wg := sync.WaitGroup{}
// 存储数据到chan中 go func() { for i := 1; i <= 10; i++ { dataChan <- i } close(dataChan) }()
// 启动多个协程去消费数据 for i := 1; i <= 3; i++ { wg.Add(1) go consumeData(dataChan, &wg, done) }
// 等待所有协程完成消费 wg.Wait()
// 关闭done通道,表示所有协程已完成工作 close(done)
fmt.Println('所有协程已完成消费')}
func consumeData(dataChan <-chan int, wg *sync.WaitGroup, done <-chan struct{}) { defer wg.Done()
for { select { case data, ok := <-dataChan: if !ok { // 数据已消费完毕 return } fmt.Println('消费数据:', data) case <-done: // 收到done通道关闭的信号,表示需要停止消费 return } }}
代码解析:
dataChan通道用于存储待消费的数据。2.done通道用于通知所有协程消费完毕。3.wg用于等待所有协程完成工作。4. 一个独立的goroutine将数据写入dataChan,并在写入完成后关闭通道。5. 多个协程并发运行consumeData函数,从dataChan中读取数据并消费。6.consumeData函数使用select语句监听dataChan和done通道: - 如果dataChan有数据可读,则读取数据并打印。 - 如果done通道关闭,则退出循环,表示所有数据已消费完毕。7. 主goroutine等待所有消费协程完成后,关闭done通道,通知所有协程停止工作。
总结:
通过使用通道和协程,我们可以轻松实现数据的顺序消费。这种模式在需要保证数据处理顺序的并发场景中非常有用。
原文地址: https://www.cveoy.top/t/topic/fP0u 著作权归作者所有。请勿转载和采集!