go并发编程 WaitGroup, Mutex
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的更多相关文章
- 六. Go并发编程--WaitGroup
一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...
- Go并发编程--Mutex/RWMutex
目录 一.前言 二. Mutex 2.1 案例 三. 实现原理 3.1 锁的实现模式 3.2 Go Mutex 实现原理 3.2.1 加锁 3.2.2 解锁 四. 源码分析 4.1 Mutex基本结构 ...
- golang并发编程
golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止go ...
- Go并发编程实战 (郝林 著)
第1章 初识Go语言 1.1 语言特性 1.2 安装和设置 1.3 工程构造 1.3.1 工作区 1.3.2 GOPATH 1.3.3 源码文件 package main import ( " ...
- [译] Go 并发编程基础
原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程 ...
- Go并发编程基础(译)
2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入 ...
- Go语言 7 并发编程
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 今天我们学习Go语言编程的第七章,并发编程.语言级别 ...
- Go -- 并发编程的两种限速方法
引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...
- Golang - 并发编程
目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...
随机推荐
- bootstrap table分页(前后端两种方式实现)
bootstrap table分页的两种方式: 前端分页:一次性从数据库查询所有的数据,在前端进行分页(数据量小的时候或者逻辑处理不复杂的话可以使用前端分页) 服务器分页:每次只查询当前页面加载所需要 ...
- 好用的JS数字格式化
/* *js格式化数字代码 * *value: 要格式化的数字值 *scale: 最多保留几位小数 *zeroed: 是否保留尾0 *percented: 是否转称百分比形式 * */ functio ...
- Codevs P1017 乘积最大
P1017 乘积最大 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的 ...
- C++字符串处理函数
#include<iostream> #include<stdlib.h> #include<string> #include <assert.h> u ...
- homework week 1
第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...
- CVE-2014-6271 漏洞告警
原理:BASH除了可以将shell变量导出为环境变量,还可以将shell函数导出为环境变量!当前版本的bash通过以函数名作为环境变量名,以“(){”开头的字串作为环境变量的值来将函数定义导出为环境变 ...
- Vladik and Entertaining Flags
Vladik and Entertaining Flags time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- mode-c++
/*感谢机房JYW的友情馈赠*/#include <iostream> #include <cstdio> #include <cstring> #include ...
- springCloud学习-断路器(Hystrix)
1.问题分析 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高 ...
- 在django里用xlwt作EXCEL导出功能
参考了以前kevin的代码,搞起来快呀,哈哈哈,,阿里亚多.... 代码的意思比较明白,不注释,几乎自解释... 就是定义EXCEL时,比较硬生生的,一步一步没有快捷的方法. 另外就是取时间出来时,如 ...