1.背景

记录一下,方便后续写代码直接使用。

需要注意几点:

  • chan 默认支持多协程工作,不需要加锁。
  • 其他变量操作需要使用锁保护(map多协程并发写会panic, 并且无法捕获)。
  • 启动goroutine时, 通常需要传递参数。不读取局部变量。
  • 需要使用waitgroup等待所有goroutine的退出(即使部分goroutine出现panic也需要wg.Done())
  • 每个goroutine都必须捕获panic, 否则panic会导致进程会挂掉。

2. 统一panic判断函数:COMMON_PANIC_CAPTURE

在工作中遇到过,由于panic 日志打印不统一在panic监控出现漏报情况。

通过封装panic判断函数,统一日志打印,方便监控添加,避免漏报情况。

package main

import (
"fmt"
"runtime/debug"
"sync"
"time"
) func COMMON_PANIC_CAPTURE(panicErr interface{}) (bool){ //封装一个panic判断/日志打印函数
if panicErr != nil {
fmt.Printf("PANIC err:%v, stack:%s\n", panicErr, debug.Stack())
return true
}
return false
} func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i=i+1 {
go func(x int){ //启动go时, 需要注意参数传递
wg.Add(1)
defer func() {
wg.Done()
COMMON_PANIC_CAPTURE(recover())
}()
if x == 2 {
panic(fmt.Sprintf("val:%d", x))
}
}(i)
}
wg.Wait() //等待go结束
time.Sleep(2 * time.Second) //等待go panic日志打印
fmt.Printf("end ok!\n")
}

3. 并发编程例子

并发写map panic, 程序无法捕获,可能是go设计的一个问题。

package main

import (
"fmt"
"sync"
"encoding/json"
) func main() {
res := make(map[string]string)
var wg sync.WaitGroup //group, 内部使用atomic实现计数
var mylock sync.Mutex for i := 0; i < 4000; i++ {
wg.Add(1)
go func(par int){
defer func() {
wg.Done()
}() //time.Sleep(3 * time.Second)
tmp := fmt.Sprintf("%d", par %7) mylock.Lock() //加锁
defer mylock.Unlock() //defer确保解锁
res[tmp] = tmp
}(i)
}
wg.Wait() resByte, _ := json.Marshal(res)
fmt.Printf("%s\n", string(resByte))
}

go并发编程 WaitGroup, Mutex的更多相关文章

  1. 六. Go并发编程--WaitGroup

    一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...

  2. Go并发编程--Mutex/RWMutex

    目录 一.前言 二. Mutex 2.1 案例 三. 实现原理 3.1 锁的实现模式 3.2 Go Mutex 实现原理 3.2.1 加锁 3.2.2 解锁 四. 源码分析 4.1 Mutex基本结构 ...

  3. golang并发编程

    golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...

  4. Go并发编程实战 (郝林 著)

    第1章 初识Go语言 1.1 语言特性 1.2 安装和设置 1.3 工程构造 1.3.1 工作区 1.3.2 GOPATH 1.3.3 源码文件 package main import ( " ...

  5. [译] Go 并发编程基础

    原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程 ...

  6. Go并发编程基础(译)

    2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入 ...

  7. Go语言 7 并发编程

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 今天我们学习Go语言编程的第七章,并发编程.语言级别 ...

  8. Go -- 并发编程的两种限速方法

    引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...

  9. Golang - 并发编程

    目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...

随机推荐

  1. win10 ubuntu18双系统环境搭建

    感谢前辈辛勤总结,根据这3篇文章成功配置了双系统 https://blog.csdn.net/qq_24624539/article/details/81775635 https://blog.csd ...

  2. react typescript 子组件调用父组件

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  3. $(document).ready(function(){}) 与 window.onload = function(){} 区别

    $(document).ready(fucntion(){ //在页面dom结构加载完毕后执行代码, }) window.onload = function(){ //页面所有内容加载完毕后,执行代码 ...

  4. linux环境图数据库neo4j安装

    自定义yum源 Neo4j Stable Yum Repo First, you'll want our key: cd /tmp wget http://debian.neo4j.org/neote ...

  5. hdu 5170 精度控制

    众所周知,GTY是一位神犇,为了更好的虐场,他从来不写数学作业而是去屠题,他的数学老师非常不爽,但由于GTY每次考试都AK,她也不能说什么,有一天老师在黑板上写了四个数——a,b,c,da,b,c,d ...

  6. Delphi 10.3.2最新消息

    官方已经发布消息,招内测人员了! https://www.barnsten.com/default/newsupdates/details?news_id=328 https://docs.googl ...

  7. 获取当前日期,或指定日期的农历js代码

    时间不早了,直接上代码啦-- var CalendarData=new Array(100);var madd=new Array(12);var tgString="甲乙丙丁戊己庚辛壬癸& ...

  8. LINUX 内核 图 外国牛人

    http://duartes.org/gustavo/blog/ http://blog.csdn.net/drshenlei

  9. CentOS下安装使用phpMyAdmin. Set up phpMyAdmin on CentOS

    须要组件: Apache PHP Mysql phpMyAdmin Apache 0. yum install httpd 1. 确认版本号 $ httpd -v 2. 启动apache $ sudo ...

  10. scikit-learn:通过Non-negative matrix factorization (NMF or NNMF)实现LSA(隐含语义分析)

    之前写过两篇文章.各自是 1)矩阵分解的综述:scikit-learn:2.5.矩阵因子分解问题 2)关于TruncatedSVD的简介:scikit-learn:通过TruncatedSVD实现LS ...