用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
2017-11-24 16:47
661 查看
直接上代码
执行结果 :
可见生产和消费异步并发执行。
执行结果
5秒之后超时(此时队列里尚有未处理完的数据)。
1、没有超时的时候
package main import ( "fmt" "time" ) func main() { //存放生产的channel jobChan := make(chan int, 100) //通知是否完成所有任务 endChan := make(chan bool) go production(jobChan) go worker(jobChan, endChan) select { case <-endChan: fmt.Println("消费完成……………………") return case <-time.After(time.Second * 20): fmt.Println("超时………………………") return } } //消费 func worker(jobChan <-chan int, endChan chan bool) { for job := range jobChan { fmt.Println("消费:", job) } //消费结束,通知endChan endChan <- true } //生产 func production(jobChan chan<- int) { for i := 1; i <= 10; i++ { fmt.Println("生产:", i) jobChan <- i } //关闭channel防止消费阻塞 close(jobChan) }
执行结果 :
可见生产和消费异步并发执行。
2、当超时时 (timeout设置小点,并增加消费处理时间)
package main import ( "fmt" "time" ) func main() { //存放生产的channel jobChan := make(chan int, 100) //通知是否完成所有任务 endChan := make(chan bool) go production(jobChan) go worker(jobChan, endChan) select { case <-endChan: fmt.Println("消费完成……………………") return case <-time.After(time.Second * 5): fmt.Println("超时………………………") return } } //消费 func worker(jobChan <-chan int, endChan chan bool) { for job := range jobChan { fmt.Println("消费:", job) //增加消费处理时间 time.Sleep(1 * time.Second) } //消费结束,通知endChan endChan <- true } //生产 func production(jobChan chan<- int) { for i := 1; i <= 10; i++ { fmt.Println("生产:", i) jobChan <- i } //关闭channel防止消费阻塞 close(jobChan) }
执行结果
5秒之后超时(此时队列里尚有未处理完的数据)。
相关文章推荐
- 一个Go语言接口和多操作系统实现的简单例子
- 一个Go语言接口和多操作系统实现的简单例子
- 使用go channel实现一个简单的信号量
- Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子
- 用socket.io实现WebSocket的一个简单例子
- 初次尝试ActiveMQ,实现简单的消息生产和消息消费
- 用R语言实现一个求导的简单例子
- 写了一个简单的NodeJS实现的进程间通信的例子
- [Atlas]一个Atlas实现的简单例子
- 增强学习系列之(二):实现一个简单的增强学习的例子
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第一章(估计要写9章)
- unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- hadoop实现的一个简单的Pagerank例子
- extJs+json实现的一个登陆验证的简单例子
- 实现一个go语言的简单爬虫来爬取CSDN博文(一)
- 一个重叠io的例子 实现一个简单的服务器
- Linux下的简单生产、消费模型的实现(上)
- 一个简单实现多条件查询的例子
- Unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子