并发编程 --- select

来源:互联网 发布:网络中py是什么意思 编辑:程序博客网 时间:2024/05/21 13:26
select

1> select可以实现无阻塞的多通道尝试读写,以及阻塞超时。
     
var c, c1, c2, c3 chan int
var i1, i2 int

select {
     case i1 = <-c1: //如果能走通任何case则随机走一个
        print( "received ", i1, " from c1\n" )
     case c2 <- i2:
        print( "sent ", i2, " to c2\n" )
     case i3, ok := (<-c3):
        if ok {
                print( "received ", i3, " from c3\n" )
        } else {
                print( "c3 is closed\n")
        }
     default// 如果case都阻塞,则走default,如果无default,则阻塞在case
        // default中可以不读写任何通道,那么只要default提供不阻塞的出路,就相当于实现了对case的无阻塞尝试读写
        print( "no communication\n")
}

2> 实现阻塞超时的方法是,只要不给default出路,而在case中实现一个超时

timeout := make (chan bool, 1)
go func () {
    time.Sleep(1e9) // 这是等待1秒钟
    timeout <- true
}()
 
// 用timeout这个通道作为阻塞超时的出路
select {
  case <-ch:
  // 处理从ch中读到的数据
  case <-timeout:
  // 如果case都阻塞了,那么1秒钟后会从这里找到出路
0 0
原创粉丝点击