ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3.10 Go之channel超时机制

2022-03-21 09:37:37  阅读:240  来源: 互联网

标签:case 执行 3.10 fmt default channel Go 超时 select


3.10 Go之channel超时机制

什么是超时?

所谓的超时可以理解为token过期,需要重新操作

Go中的channel超时机制

为了防止channel被其他goroutine竞争,所以需要设置一个超时处理器

处理办法:

使用select来处理超时

Goselect的使用方法以及和switch的区别

select的特点:

  1. 其中有一个case完成程序就会往下执行而不考虑其他case的情况

  2. 每个case的语句里面必须是一个i/o操作

  3. select块当中有多条语句可以执行(多个goroutine都不阻塞)时随机选择一条来执行

select{
   case <-chan1:
   // chan1成功读取到数据则执行该case
case chan2 <- 1:
   // 成功向chan2写入数据则执行该case
   default:
   // 如果上面都没有成功,则进入default处理流程
}

所有goroutine都阻塞的情况:

  • 没有定义defaultselect语句会被阻塞.直到至少有一个通信可以进行下去

  • 定义了default语句,执行default.同时程序的执行会从 select语句后的语句中恢复

实例代码:

package main

import (
   "fmt"
   "time"
)

/*
模拟一个go的超时处理办法
使用select进行处理
*/
func main() {
   // 定义两个通道,一个进,一个出
   ch := make(chan int)
   quit := make(chan bool)

   // 开启一个协程进行超时处理
   go func() {
       // 循环执行select
       for {
           select {
           /* 能从ch通道当中读取到数据 */
           case num := <-ch:
               fmt.Println("号码 = ", num)
           case <-time.After(3 * time.Second):
               fmt.Println("超时")
               // 同时将该条信息告知出通道--->放入成功
               quit <- true
           //default:
           //   fmt.Println("未知情况!")
           //   quit <- false
          }
      }
  }()

   // 循环往ch通道放值
   for i := 0; i < 5; i++ {
       ch <- i
       time.Sleep(time.Second)
  }

   // 匿名接收quit通道内的值--->只是为了保证goroutine不死锁
   judge := <-quit
   switch judge {
   case true:
       fmt.Println("程序结束!")
   case false:
       fmt.Println("程序异常!")
  }
}

分析:

  1. 前四次执行的是case num的操作,最后一次执行的是case <-time.After的逻辑

  2. 每次往ch通道中放入值的时候都进行了时间等待,为了超时的时候执行time.After

  3. **default要重点理解,

标签:case,执行,3.10,fmt,default,channel,Go,超时,select
来源: https://www.cnblogs.com/JunkingBoy/p/16033289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有