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


    1、代码

    2、运行

    3、解析


    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)主线程退出

  • 相关阅读:
    F. The Treasure of The Segments
    D. Zigzags
    C. Binary String Reconstruction
    B. RPG Protagonist
    中国计量大学同步赛补题
    Teacher Ma专场补题
    2020ICPC上海站总结&补题
    华东202011月赛补题
    算法学习之旅——树状数组
    迷宫
  • 原文地址:https://www.cnblogs.com/fengbohello/p/4657959.html
Copyright © 2020-2023  润新知