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,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
113 1
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
273 1
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
340 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
220 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
194 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
287 0
|
3月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
3月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
3月前
|
数据采集 编解码 监控
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。
|
Go 微服务
一文搞懂如何实现 Go 超时控制
为什么需要超时控制? 请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义。过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至出现不可用事故。