Go生产者消费者问题 |
您所在的位置:网站首页 › golang中的channel实现生产者消费者 › Go生产者消费者问题 |
Golang最大的一个特性就是其并发的设计。所有Go程序都跑在goroutine里,main函数也是一个goroutine。一般情况下 goroutine的通信采用读写channel来完成。偶然看到一道题面试题,要求Go来实现生产者消费者模型,刚好也没手写过借此机会写一写。 概述生产者消费者问题是经典的并发同步问题。描述有若干生产者和若干消费者,生产者负责生产产品并将产品放入盒子(缓冲区),而消费者则消费盒子的产品。 问题的关键为消费者之间、生产者之间、消费者与生产者之间的竞争,以及在“盒子”满了,应该停止(阻塞)生产者的生产,在“盒子”空了应该停止(阻塞)消费者的消费。 传统的方式,我们需要用锁,信号量等来处理,而Go并不需要,通过Go的goroutine以及channel可以很方便的实现生产者消费者模型。 定义定义三个结构体,分别表示生产者、消费者、产品,每个结构体只定义一个属性,可自行扩展。 // 产品 type Product struct { No string // 产品编号 } // 生产者 type Producer struct { No int } // 消费者 type Comsumer struct { No int } “盒子”“盒子”为是goroutine通信的方式,用channel 本题中定义有缓冲区和无缓冲区的channel其实都可以。因为并不会在一个goroutine中同时读写,即生产者不会进行消费,消费者不会进行生产。只是如果定义为无缓冲的channel,那每次生产一个产品就必须等消费者消费后才能继续生产,相当于盒子只能放一个产品。本次我们定义一个有缓冲的channel。 var Box = make(chan Product, 1024) 生产 func (p Producer) func work() { for { // 生产产品(用一个uuid作为产品的唯一编号) product := Product{ No: uuid.NewV4().String() } // 将产品放置盒子 Box |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |