码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • golang使用channel通道实现非阻塞队列和超时阻塞队列


    文章目录

    • golang使用channel通道实现非阻塞队列和超时阻塞队列
      • 背景
      • select的多路复用(不阻塞读channel、非阻塞写入channel),可以用于检测某个通道是否满了,是否是空的
      • 实现非阻塞队列

    golang使用channel通道实现非阻塞队列和超时阻塞队列

    背景

    golang的通道(chan)可分为不带缓存的通道和带缓存的通道。用make函数创建通道的时候,如果不指定缓存大小,创建的就是不带缓存的通道。

    向通道中放入数据的一端可以称为生产者,从通道获取数据的一端可以称为消费者。
    不带缓存的通道,在通道任一一端没有准备就绪之前,另一端就会产生阻塞。

    生产者往channel写数据,但是channel满了,导致生产者阻塞。

    Channel是Golang中非常重要的数据结构, golang的channel读或写是会造成阻塞的,但是可以用select的多路复用解决这个问题。

    select的多路复用(不阻塞读channel、非阻塞写入channel),可以用于检测某个通道是否满了,是否是空的

    golang select default continue_Go并发(四):select篇
    参考URL: https://blog.csdn.net/weixin_39520393/article/details/109969948

    golang select default
    select存在default的话,在case不命中的情况下,会直接进入default分支,协程一样会结束,不会阻塞住。

    不阻塞读channel(也可以加上超时)

    func readChan(c chan int) (int, error) {
    	select {
    	case num := <-c:
    		return num, nil
    	default:
    		return 0, errors.New("chan do not have data")
    	}
    }
    
    // 加上超时时间
    func readChanWithTimeout(c chan int) (int, error) {
    	timeout := time.NewTimer(time.Microsecond * 100)
    
    	select {
    	case num := <-c:
    		return num , nil
    	case <-timeout.C:
    		return 0, errors.New("read chan time out")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    非阻塞写入channel(也可以加上超时)

    func writeChan(num int, c chan int) error {
    	select {
    	case ch <- num:
    		return nil
    	default:
    		return errors.New("chan is full")
    	}
    }
    
    // 加上超时时间
    func writeChanWithTimeout(num int, c chan int) error {
    	timeout := time.NewTimer(time.Microsecond * 100)
    
    	select {
    	case c <- num:
    		return nil
    	case <-timeout.C:
    		return errors.New("write chan time out")
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    实现非阻塞队列

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例:

    即只要在select中加入default,阻塞立即变成非阻塞:

    package main
    
    import "fmt"
    
    func main() {
        messages := make(chan string)
        signals := make(chan bool)
    
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        default:
            fmt.Println("no message received")
        }
    
        msg := "hi"
        select {
        case messages <- msg:
            fmt.Println("sent message", msg)
        default:
            fmt.Println("no message sent")
        }
    
        select {
        case msg := <-messages:
            fmt.Println("received message", msg)
        case sig := <-signals:
            fmt.Println("received signal", sig)
        default:
            fmt.Println("no activity")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    解决2K/4K高分屏下Vmware等虚拟机下Kail Linux界面显示问题
    测试人生 | (汇总篇)从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了
    笙默考试管理系统-MyExamTest----codemirror(29)
    PCB铺铜的那些事
    redis群集有三种模式(主从同步/复制、哨兵模式、Cluster)
    uniapp微信小程序嵌入页面web-view配置
    唐先杰遇上区块链:要加薪,也要改变世界 | 对话MVP
    FastGateway 一个可以用于代替Nginx的网关
    Avue树结构懒加载子节点不刷新
    Linux安装omnet++
  • 原文地址:https://blog.csdn.net/inthat/article/details/127615951
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号