iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang select机制和超时问题怎么解决
  • 535
分享到

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

2023-07-02 13:07:04 535人浏览 薄情痞子
摘要

这篇文章主要介绍了golang select机制和超时问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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机制和超时问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网GO频道。

您可能感兴趣的文档:

--结束END--

本文标题: golang select机制和超时问题怎么解决

本文链接: https://www.lsjlt.com/news/342048.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • golang select机制和超时问题怎么解决
    这篇文章主要介绍了golang select机制和超时问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang select机制和超时问题怎么解决文章都会有所收获,下面我们一起...
    99+
    2023-07-02
  • golang select 机制和超时问题
    golang 中的协程使用非常方便,但是协程什么时候结束是一个控制问题,可以用 select 配合使用。 首先声明,golang 使用并不熟悉,本文仅仅是记录使用过程中遇到的一些坑。...
    99+
    2024-04-02
  • Dubbo retries超时重试机制的问题怎么解决
    本篇内容主要讲解“Dubbo retries超时重试机制的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Dubbo retries超时重试机制的问题怎么解决”吧!...
    99+
    2023-06-30
  • 怎么解决redis连接超时问题
    这篇文章给大家分享的是有关怎么解决redis连接超时问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题描述:redis连接超时,然后定位到redis配置文件目录被删除,接着尝...
    99+
    2024-04-02
  • 解决FinalShel连接虚拟机超时问题
    解决FinalShell连接虚拟机超时问题 一:前言 为了解决链接超时问题,自己电脑底部任务栏开了一大堆,浏览器里网页开了一个又一个,这种搜索无果的情况,持续了大概3天的时间,中间怀疑自我到是不是我的电脑硬件少了个螺丝什么的(哈哈哈哈),还...
    99+
    2023-08-19
    服务器 linux 网络
  • 云服务器超时问题怎么解决
    在解决云服务器超时问题时,可以尝试以下几个方法:1. 检查网络连接:确保服务器与互联网的连接正常。可以使用ping命令测试服务器是否...
    99+
    2023-09-16
    云服务器
  • 解决Golang time.Parse和time.Format的时区问题
    一、问题描述 在windows下,time.Parse()的时区和time.Format()的时区是一致的。 但是在linux环境下,time.Parse()的默认时区是UTC,ti...
    99+
    2024-04-02
  • 解决运行clickhouseSql超时问题
    表现 在平时工作中,会用到dolphinscheduler/datagrip/dbever等运行clickhouseSql,而clickhouse的jdbc在运行过程中给予我的痛苦可不是一星半点,常常运行一个sql会报错,没错,就是tim...
    99+
    2023-09-21
    数据库 mysql clickhouse 大数据
  • session超时问题如何解决
    要解决会话超时问题,可以考虑以下几种方法:1. 增加会话超时时间:可以调整系统设置,延长会话超时时间,以允许用户有更长时间进行操作。...
    99+
    2023-09-21
    session
  • Golang自带的HttpClient超时机制怎么实现
    本篇内容主要讲解“Golang自带的HttpClient超时机制怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang自带的HttpClient超时机制怎么实现”吧!Java Htt...
    99+
    2023-07-04
  • springcloud之Feign超时问题的解决
    问题背景 最近公司项目有个功能需进行三层Feign调用,且还要调外部接口,延迟挺大,造成Feign一直提示Read timed out executing POST。 feign...
    99+
    2024-04-02
  • 怎么解决mysql5数据库连接超时问题
    本篇内容主要讲解“怎么解决mysql5数据库连接超时问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mysql5数据库连接超时问题”吧! ...
    99+
    2024-04-02
  • 云服务器连接超时怎么解决问题
    云服务器连接超时通常是由以下原因引起的: 网络连接超时:服务器和目标服务器之间的网络连接可能存在问题,服务器无法与目标服务器建立连接。这会导致服务器无法正确处理请求,从而影响服务的中断。 DNS查找超时:如果服务器无法找到目标服务器,则...
    99+
    2023-10-27
    解决问题 服务器
  • Dubbo retries 超时重试机制的问题原因分析及解决方案
    目录异常日志异常原因解决方案Dubbo超时重试机制异常日志 [com.alibaba.dubbo.rpc.filter.TimeoutFilter] -  [DUBBO] ...
    99+
    2024-04-02
  • golang协程调度超时怎么解决
    在 Go 语言中,可以使用 context 包来进行协程调度超时的处理。 首先,你需要创建一个 context.Context 对象...
    99+
    2023-10-21
    golang
  • 怎么解决jquery select不可编辑问题
    本篇内容主要讲解“怎么解决jquery select不可编辑问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决jquery select不可编辑问题”吧...
    99+
    2024-04-02
  • 如何解决MongoDB游标超时问题
    这篇文章给大家分享的是有关如何解决MongoDB游标超时问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。当我们使用Python从MongoDB里面读取数据时,可能会这样写代码:...
    99+
    2024-04-02
  • 解决axios:"timeoutof5000msexceeded"超时的问题
    目录axios:"timeout of 5000ms exceeded"超时报错 Error: timeout of 5000ms exceededaxios:&...
    99+
    2022-11-13
    解决axios超时 timeout of 5000ms exceeded 超时问题
  • win10显示器超出频率限制问题怎么解决
    如果您的Windows 10显示器超出频率限制,您可以尝试以下解决方法:1. 重启电脑:有时候只需简单地重启电脑即可解决显示器超出频...
    99+
    2023-09-15
    win10
  • 阿里云服务器指令超时怎么解决问题
    简介 阿里云服务器是一种强大的云计算服务,但有时候我们可能会遇到指令超时的问题。本文将介绍一些常见的原因和解决方法,帮助您解决阿里云服务器指令超时的问题。解决方法1. 检查网络连接指令超时的一个常见原因是网络连接问题。首先,您可以检查您的网...
    99+
    2024-01-29
    阿里 解决问题 指令
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作