码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Go并发编程之常见并发bug


     注意:下述所有图片中 - 号是BUG代码,+号是修复BUG的代码

    1.死锁

    goroutine1 ch发送者被阻塞住,无法释放锁

    goroutine2 loop获取锁失败

     

    2.goroutine永久泄露

     context.WithCancel内部启动goroutine,在ctx被覆盖后goroutin永久泄露

    3.waitgroup使用不当,永久阻塞

    使用WaitGroup一定要遵守的原则就是,等所有的Add方法调用之后再调用Wait,否则就可能导致panic或者不期望的结果

    4.闭包捕获本地变量

    5.goroutine启动前要保证waitgroup.Add完成

    6.多次关闭同一个channel

     关闭已经关闭的channel会导致panic,因此在并发编程中要处理好channel的关闭

    7.map 并发读写

    这个bug无法被recover

    线上做好supervisor和stderr重定向到文件,不然两眼一抹黑

    共享资源竞争的问题,非常复杂,并且难以察觉,好在 Go 为我们提供了一个工具帮助我们检查,这个就是go build -race 命令。在项目目录下执行这个命令,生成一个可以执行文件,然后再运行这个可执行文件,就可以看到打印出的检测信息。

    并发场景下考虑使用:sync.map

    8.不控制gouroutine数量

    这个例子实现了 math.MaxInt32 个协程的并发,约 2^31 = 2 亿个

    运行会直接导致:​panic: too many concurrent operations on a single file or socket (max 1048575)

    不同的应用程序,消耗的资源是不一样的。比较推荐的方式的是:应用程序来主动限制并发的协程数量。

    • 利用缓冲信道实现[2]

    • make(chan struct{}, 3) 创建缓冲区大小为 3 的 channel,在没有被接收的情况下,至多发送 3 个消息则被阻塞。
    • 开启协程前,调用 ch <- struct{}{},若缓存区满,则阻塞。
    • 协程任务结束,调用 <-ch 释放缓冲区。
    • sync.WaitGroup 并不是必须的,例如 http 服务,每个请求天然是并发的,此时使用 channel 控制并发处理的任务数量,就不需要 sync.WaitGroup。 
    • 利用第三方协程池库实现,比较受欢迎的有[2]
      • Jeffail/tunny
      • panjf2000/ants

    References

    1.如何优雅地关闭通道

    2.Go高性能编程之并发编程

  • 相关阅读:
    基于Java毕业设计游泳馆管理平台源码+系统+mysql+lw文档+部署软件
    springboot vue elementui理发店预约系统源码
    OpenSSH移植到Linux开发板
    EDUSRC--简单打穿某985之旅
    IB课程从29分提到44分,如何拿捏?
    洛谷 P1640 [SCOI2010] 连续攻击游戏(二分图最大匹配)
    前端vue实现页面加水印文字 单个页面所有页面加水印(更新版)
    Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores
    光伏三相并网逆变器的控制策略与性能分析(Simulink仿真实现)
    java每日一练 (1)
  • 原文地址:https://blog.csdn.net/qq_37186127/article/details/125530633
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号