我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang select机制和超时问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang select机制和超时问题怎么解决

这篇文章主要介绍了golang select机制和超时问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang select机制和超时问题怎么解决文章都会有所收获,下面我们一起来看看吧。

golang 中的协程使用非常方便,但是协程什么时候结束是一个控制问题,可以用 select 配合使用。

子协程和父协程的通信通常用 context 或者 chan。我遇到一个通常的使用场景,在子协程中尝试多次处理,父协程等待一段时间超时,我选择用 chan 实现。我以为 select 和 C++ 中 switch 类似,所以最开始代码类似如下:

for {    select {        case <-ctx.Done():            // process ctx done        case <-time.After(time.Second * 3):            // process after        default:            // process code    }}

测试发现无法实现 timeout,又仔细查看文档,才发现 golang 中 select 另有玄机。废话少说,直接总结要点:

  • select 中的 case 必须是进行 chan 的手法操作,也就是只能在 case 中操作 chan,并且是 非阻塞接收 。

  • select 中的 case 是同时监听的,多个 case 同时操作,并未 switch 中一个个顺序判断。如果多个 case 满足要求,随机执行一个,如果一个没有则阻塞当前的协程(没有 default 情况下)。 很类似 Linux 文件符操作的 select 语义 。

  • 上面说的阻塞是没有 default 的情况下,如果有 default,则执行 default,然后退出 select,也就是不会阻塞当前协程。

回到上述代码,我这个 select 会一直不断的执行 default, time.After 生成的 chan 并不会被阻塞判断,所以根本无法完成我想要的效果。理解了之后重新修改代码:

done := make(char int)go func(c chan int) {    for {        // process code        if {            c <- 1            return        }    }    c <- 0}(done)select {    case <-ctx.Done():        // process ctx done    case <-time.After(time.Second * 3):        // process after    case <-done:        // process code}

开一个新的协程去不断尝试,在外的三个 case 有一个满足,则会执行。但是这里有一个问题非常需要注意: 子协程什么时候退出? 。

因为 gorountine 不能被强制 kill,所以在上述超时的情况下,select 语句执行 case time.After 之后退出, done 这个 chan 已经没有接受方了,因此既没有接受者,又没有缓冲区,结合 chan 的特性,则子协程会一直阻塞无法退出,所以本质上这个实现会导致子协程累积下去,也就是 协程泄露 ,可能会使资源耗尽。

如何避免上述问题呢?一个很简单的想法就是提供缓冲区, done := make(char int, 1) ,这样即使没有接收方,子协程也能完成发送,不会被阻塞。

还要一种办法,上面说了,select 操作 chan,并且可以指定 default,那是不是有思路了呢?

if {    select {        case done <- 1:        default:            return    }}

关于“golang select机制和超时问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“golang select机制和超时问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

golang select机制和超时问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang select机制和超时问题怎么解决

这篇文章主要介绍了golang select机制和超时问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang select机制和超时问题怎么解决文章都会有所收获,下面我们一起来看看吧。golan
2023-07-02

Dubbo retries超时重试机制的问题怎么解决

本篇内容主要讲解“Dubbo retries超时重试机制的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Dubbo retries超时重试机制的问题怎么解决”吧!异常日志[com.a
2023-06-30

云服务器超时问题怎么解决

解决云服务器超时问题的方案检查网络连接,优化服务器配置,优化代码和应用程序,监控和故障排除,其他方案(负载均衡器、升级、分布式架构、DNS优化)。
云服务器超时问题怎么解决
2024-04-09

云服务器超时问题怎么解决

在解决云服务器超时问题时,可以尝试以下几个方法:1. 检查网络连接:确保服务器与互联网的连接正常。可以使用ping命令测试服务器是否能够与其他计算机进行通信,如果无法ping通,可能是网络配置或者防火墙设置的原因。2. 检查防火墙设置:确保
2023-09-16

解决FinalShel连接虚拟机超时问题

解决FinalShell连接虚拟机超时问题 一:前言 为了解决链接超时问题,自己电脑底部任务栏开了一大堆,浏览器里网页开了一个又一个,这种搜索无果的情况,持续了大概3天的时间,中间怀疑自我到是不是我的电脑硬件少了个螺丝什么的(哈哈哈哈),还
2023-08-19

Golang自带的HttpClient超时机制怎么实现

本篇内容主要讲解“Golang自带的HttpClient超时机制怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang自带的HttpClient超时机制怎么实现”吧!Java Htt
2023-07-04

云服务器连接超时怎么解决问题

云服务器连接超时通常是由以下原因引起的:网络连接超时:服务器和目标服务器之间的网络连接可能存在问题,服务器无法与目标服务器建立连接。这会导致服务器无法正确处理请求,从而影响服务的中断。DNS查找超时:如果服务器无法找到目标服务器,则会出现连接超时的情况。这可能是由于DNS查找过程中出错或服务器本身出现问题导致的。服务器
云服务器连接超时怎么解决问题
2023-10-27

golang协程调度超时怎么解决

在 Go 语言中,可以使用 context 包来进行协程调度超时的处理。首先,你需要创建一个 context.Context 对象,并设置超时时间。然后,在需要执行耗时操作的协程中,使用 context.WithTimeout 函数将该
2023-10-21

win10显示器超出频率限制问题怎么解决

如果您的Windows 10显示器超出频率限制,您可以尝试以下解决方法:1. 重启电脑:有时候只需简单地重启电脑即可解决显示器超出频率限制的问题。2. 进入安全模式:在启动电脑时按下F8或Shift键,选择进入安全模式。在安全模式下,您可以
2023-09-15

redis商品超卖问题怎么解决

Redis商品超卖问题是指在高并发情况下,商品库存被多次减少导致出现负库存的情况。解决Redis商品超卖问题可以使用以下几种方法:乐观锁:在操作商品库存前,通过获取商品当前库存的值,并在更新库存时比较该值是否与之前获取的一致。如果一致则进行
2023-10-21

阿里云服务器指令超时怎么解决问题

简介阿里云服务器是一种强大的云计算服务,但有时候我们可能会遇到指令超时的问题。本文将介绍一些常见的原因和解决方法,帮助您解决阿里云服务器指令超时的问题。解决方法1.检查网络连接指令超时的一个常见原因是网络连接问题。首先,您可以检查您的网络连接是否正常。可以尝试访问其他网站或使用其他应用程序来确认网络连接是否正常。如果网
阿里云服务器指令超时怎么解决问题
2024-01-29

Golang gin跨域问题怎么解决

本文小编为大家详细介绍“Golang gin跨域问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang gin跨域问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。gin跨域解决方案co
2023-06-30

golang高并发问题怎么解决

在Go语言中,高并发问题可以通过以下几种方式来解决:使用goroutine:Goroutine是Go语言的轻量级线程,可以并发执行函数。通过将任务分解为多个并发执行的goroutine,可以提高程序的并发处理能力。使用channel:Cha
golang高并发问题怎么解决
2024-02-29

解决mysql连接超时和mysql连接错误的问题

目录mysql连接超时和mysql连接错误连接MySQL错误create connection SQLException, url: jdbc:mysql://localhost:3306/*****?解决方法mysql连接超时和mysql
2022-07-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录