select实战指南:协程切换技术

简介: select实战指南:协程切换技术

Go 语言的并发编程模型以其简洁而强大的 goroutine 为特色。

select 语句则是在多个通信操作中选择一个执行的关键工具。

本文将讨论如何使用 select 切换协程,通过清晰的示例代码,帮助读者掌握这一重要的并发编程技巧。


package main
import (  "fmt" "time")
func main() { ch1 := make(chan string)  ch2 := make(chan string)
  go func() {   time.Sleep(2 * time.Second)   ch1 <- "goroutine 1 completed"  }()
  go func() {   time.Sleep(1 * time.Second)   ch2 <- "goroutine 2 completed"  }()
  select {  case res := <-ch1:    fmt.Println(res)  case res := <-ch2:    fmt.Println(res)  }}


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch <- "goroutine completed"  }()
  select {  case res := <-ch:    fmt.Println(res)  case <-time.After(1 * time.Second):    fmt.Println("Timeout: goroutine not completed within 1 second")  }}


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "goroutine 1 completed"  }()
  go func() {    time.Sleep(1 * time.Second)    ch2 <- "goroutine 2 completed"  }()
  for i := 0; i < 2; i++ {    select {    case res := <-ch1:      fmt.Println(res)    case res := <-ch2:      fmt.Println(res)    }  }}


package main
import (  "fmt"  "time")
func main() {  ch := make(chan string)
  select {  case res := <-ch:    fmt.Println(res)  default:    fmt.Println("No communication yet")  }
  go func() {    time.Sleep(1 * time.Second)    ch <- "goroutine completed"  }()
  time.Sleep(2 * time.Second)}



package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  select {  case res := <-ch1:    fmt.Println(res)  case res := <-ch2:    fmt.Println(res)  default:    fmt.Println("No communication yet")  }
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "goroutine 1 completed"  }()
  time.Sleep(1 * time.Second)}


package main
import (  "fmt"  "time")
func main() {  ch1 := make(chan string)  ch2 := make(chan string)
  go func() {    time.Sleep(2 * time.Second)    ch1 <- "goroutine 1 completed"  }()
  go func() {    time.Sleep(1 * time.Second)    ch2 <- "goroutine 2 completed"  }()
  for i := 0; i < 2; i++ {    select {    case res := <-ch1:      fmt.Println(res)    case res := <-ch2:      fmt.Println(res)    }  }}


 

总结

通过本文的讨论和示例代码,对如何使用 select 切换协程有了更深入的理解。

select 是 Go 语言并发编程中的一项强大工具,掌握其使用技巧将有助于读者更好地处理并发场景,提高代码的可读性和可维护性。

在实际项目中,善用 select 将使你的并发代码更加优雅而高效。

目录
相关文章
|
Java 编译器 测试技术
枯燥的Kotlin协程三部曲(中)——应用实战篇(中)
上节《枯燥的Kotlin协程三部曲(上)——概念启蒙篇》,追根溯源,先了解并发相关的概念,尔后引出Kotlin协程
274 0
|
1月前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
【7月更文挑战第15天】Python的协程与异步函数优化Web性能,通过非阻塞I/O提升并发处理能力。使用aiohttp库构建异步服务器,示例代码展示如何处理GET请求。异步处理减少资源消耗,提高响应速度和吞吐量,适用于高并发场景。掌握这项技术对提升Web应用性能至关重要。
57 10
|
Linux Go
学习golang(12) 初探:协程(3)多个chan之select选择器
学习golang(12) 初探:协程(3)多个chan之select选择器
204 0
|
网络协议 安全 Python
【Tornado】协程队列和异步DNS解析器在Tornado项目里的实战表现已经运用详解
【Tornado】协程队列和异步DNS解析器在Tornado项目里的实战表现已经运用详解
160 2
使用 select 切换协程
在 Go 中,可以通过关键字select来完成从不同的并发执行的协程中获取值,它和switch控制语句非常相似,也被称作通信开关;它的行为像是“你准备好了吗”的轮询机制;select监听进入通道的数据,也可以是用通道发送值的时候。
|
Java API 调度
枯燥的Kotlin协程三部曲(中)——应用实战篇(下)
上节《枯燥的Kotlin协程三部曲(上)——概念启蒙篇》,追根溯源,先了解并发相关的概念,尔后引出Kotlin协程
299 0
|
存储 Java API
枯燥的Kotlin协程三部曲(中)——应用实战篇(上)
上节《枯燥的Kotlin协程三部曲(上)——概念启蒙篇》,追根溯源,先了解并发相关的概念,尔后引出Kotlin协程
608 0
|
缓存 监控 Linux
多进程、协程、事件驱动及select poll epoll
目录 -多线程使用场景 -多进程  --简单的一个多进程例子  --进程间数据的交互实现方法    ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享    ---Queues     ---Pipe     ---通过Manager可以不同进程间实现数...
1246 0
|
2月前
|
Go Python
使用python实现一个用户态协程
【6月更文挑战第28天】本文探讨了如何在Python中实现类似Golang中协程(goroutines)和通道(channels)的概念。文章最后提到了`wait_for`函数在处理超时和取消操作中的作
29 1
使用python实现一个用户态协程
|
1月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
34 6