用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
来源:互联网 发布:二叉树遍历递归算法 编辑:程序博客网 时间:2024/06/10 19:37
直接上代码
1、没有超时的时候
package mainimport ( "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 mainimport ( "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秒之后超时(此时队列里尚有未处理完的数据)。
阅读全文
0 0
- 用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
- 理解Go的Goroutine和channel
- 使用go channel实现一个简单的信号量
- go goroutine 简单实现生产者和消费者
- 生产-消费模式的synchronized和lock实现(十)
- Go中的goroutine和channel使用
- TODO:Go语言goroutine和channel使用
- 消费和生产 二条线程同步 的例子
- go的goroutine问题
- Go语言的goroutine
- 初次尝试ActiveMQ,实现简单的消息生产和消息消费
- golang-goroutine与channel:高效的channel
- golang-goroutine与channel:高效的channel
- Laravel实现一个简单的小例子
- Linux下的简单生产、消费模型的实现(上)
- Linux下的简单生产、消费模型的实现(下)
- 一个Go语言接口和多操作系统实现的简单例子
- 整理修改的一个日志类,用生产与消费模式实现,消费模式用了异步执行
- Spring @Configuration用annotation装配spring
- PHP获得本周、本月、上周、上月起始时间戳
- 23种设计模式全解析
- <学习html>第八天笔记-HTML5文档类型和字符集、HTML5新标签与特性(常用新标签、新增input type属性值、常用新属性、多媒体标签)
- jmeter应用---测试元件介绍(三)
- 用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
- Java程序员们最常犯的10个错误
- ceph (luminous 版) journal disk 故障测试
- 正则表达式常用对象方法整理
- Linux中进程间通信——共享内存
- Android Studio 启动项目报错 Warning:Uninstalling will remove the application data!
- main函数一定要有返回值吗?
- linux rsync 使用说明
- Splunk 操作系统App和Add-on整理总结