GO语言练习:channel select 超时机制

简介:

1、代码

复制代码
 1 package main
 2 
 3 import (
 4     "time"
 5     "fmt"
 6 )
 7 
 8 func waitFor(ch chan int) {
 9     fmt.Println(time.Now(), "writing ...")
10     time.Sleep(1e9)
11     ch <- 10
12     fmt.Println(time.Now(), "wrote ...")
13 }
14 
15 func main() {
16     var a chan int = make(chan int)
17     var b chan int = make(chan int)
18     var ch chan int = make(chan int)
19 
20     go waitFor(ch)
21 
22     var r int = 0
23     fmt.Println(time.Now(), "select ...")
24     select {
25     case x := <-a :
26         fmt.Println(time.Now(), "read from a...")
27         r = x
28     case x := <-b :
29         fmt.Println(time.Now(), "read from b...")
30         r = x
31     case x := <-ch :
32         fmt.Println(time.Now(), "read from ch...")
33         r = x
34     }
35     fmt.Println(time.Now(), "select over.., r = ", r)
36     time.Sleep(1e9)
37     fmt.Println(time.Now(), "over..")
38 }
复制代码

2、运行

复制代码
1 $ go run timeout.go 
2 2015-07-19 00:35:23.859684465 +0800 CST select ...
3 2015-07-19 00:35:23.861022451 +0800 CST writing ...
4 2015-07-19 00:35:24.864462549 +0800 CST wrote ...
5 2015-07-19 00:35:24.865185396 +0800 CST read from ch...
6 2015-07-19 00:35:24.874655353 +0800 CST select over.., r =  10
7 2015-07-19 00:35:25.888486739 +0800 CST over..
复制代码

3、解析

  1)主线程中的select开始运行,对select中的3个channel进行阻塞等待

  2)在线程(协程)waitFor中向ch写入数据

  3)select收到数据,进行读取

  4)主线程退出

 



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4657959.html,如需转载请自行联系原作者


相关文章
|
2天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
2天前
|
SQL 关系型数据库 MySQL
go语言中安装数据库驱动
【11月更文挑战第1天】
15 5
|
2天前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
10 3
|
3天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
13 4
|
3天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
14 4
|
3天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
14 4
|
2天前
|
关系型数据库 MySQL 数据库连接
go语言中打开数据库连接
【11月更文挑战第1天】
12 2
|
6天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
23 6
|
6天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
3天前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####