首页 > 其他分享 >Go race数据竞争检测

Go race数据竞争检测

时间:2023-08-24 23:44:33浏览次数:36  
标签:testrace 检测 mnt test race go Go main

对同一内存的竞争读写,会导致出现数据错乱,是多进程/线程编码中的常见问题。

go中提供了race工具协助识别代码中的数据竞争问题。使用起来也非常方便,设计编译的操作时加上-race即可:

go test -race xxx

go run -race xxx

go build -race xxx

go install -race xxx

这样编译出来的二进制在执行时如果检测到竞争,就可以输出报告。

还可以通过GORACE环境变量来控制race的一些行为,比如输出报告的路径,检测到报告是否退出等。

举例:

package main

import "time"

func myChan() {
	ch1 := make(chan int, 1)

	go func() {
		ch1 <- 123
	}()

	time.Sleep(1 * time.Second)
	close(ch1)
}

func main() {
	myChan()
}

执行输出:

zxq@DESKTOP-0BAPSTC:/mnt/d/go_test$ go run -race go_testrace.go
==================
WARNING: DATA RACE
Write at 0x00c000122010 by main goroutine:
  runtime.closechan()
      /usr/local/go/src/runtime/chan.go:357 +0x0
  main.myChan()
      /mnt/d/go_test/go_testrace.go:13 +0x84
  main.main()
      /mnt/d/go_test/go_testrace.go:17 +0x2f

Previous read at 0x00c000122010 by goroutine 6:
  runtime.chansend()
      /usr/local/go/src/runtime/chan.go:158 +0x0
  main.myChan.func1()
      /mnt/d/go_test/go_testrace.go:9 +0x4b

Goroutine 6 (finished) created at:
  main.myChan()
      /mnt/d/go_test/go_testrace.go:8 +0x69
  main.main()
      /mnt/d/go_test/go_testrace.go:17 +0x2f
==================
Found 1 data race(s)
exit status 66

从代码可以看出,执行过程本身是不会竞争的(sleep错开了时间),但是程序检测到了这个风险。

race检测的特点:

1.运行时检测,不是静态代码检查。

2.只有执行到的代码才能被检查出来竞争。比如一些if else的代码分支没走到,就不会检测到其中可能存在的竞争。

3.只要代码执行到就能检测出来,即使不一定出现竞争。比如上面的例子,一般是不会出现竞争态的。

4.会严重影响程序性能,可能会占用数倍的cpu和内存。所以正式环境不能上线。

标签:testrace,检测,mnt,test,race,go,Go,main
From: https://www.cnblogs.com/zxq89/p/16772854.html

相关文章

  • go.mod 浅谈理解
    go.mod对于上次接触golang这门语言还是在上次了,最近对zig比较感兴趣,而突然折腾回golang的时候发现这玩意在1.1.1版本更新了一个叫go.mod的东西。go.mod是Go语言的官方包管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。Go.mod其实就是一个Module......
  • Go语言数组的使用
    目录1.数组的使用1.1数组的定义方式1:1.2数组的定义方式2:1.3数组的定义方式3:1.4数组的定义方式4:1.5数组的遍历1:1.6数组的遍历2:1.7数组的遍历3:1.8数组的遍历4:1.数组的使用1.1数组的定义方式1:packagemainimport"fmt"funcmain(){ vararr[3]string arr[0]="A......
  • Go语言切片的使用
    目录2.切片的使用2.1切片的定义方式1:2.2切片的定义方式2:2.3切片的定义方式3:2.4切片的定义方式4:2.5切片的定义方式5:2.6切片的定义方式6:遍历方式和数组差不多2.切片的使用2.1切片的定义方式1:packagemainimport"fmt"funcmain(){ varslice[]string slice=appe......
  • Go语言字典(map)的使用
    目录3.字典(map)的使用3.1字典的初始化方式1:3.2字典的初始化方式2:3.3字典的初始化方式3:3.4字典的遍历1:3.5字典的遍历2:3.6判断字典中有无某个key3.7删除字典中的某个键值对3.字典(map)的使用3.1字典的初始化方式1:packagemainimport"fmt"funcmain(){ varscoreM......
  • python独立脚本应用Django项目的环境
    一、需求说明一直用Django在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统。主要是对密码的加密,在注册或者登录的时候,前端传递多来的密码,我会使用Django的set_password()方法在加密一次经过加密后的数据库中的数据样子如下:......
  • golang之增加版本信息功能
    在实际开发中,当开发完一个apiserver特性后,会编译apiserver二进制文件并发布到生产环境,很多时候为了定位问题和出于安全目的(不能发错版本),我们需要知道当前apiserver的版本,以及一些编译时候的信息,如编译时Go的版本、Git目录是否clean,以及基于哪个gitcommmit来编译的。......
  • RunnerGo:一款高效且易用的性能测试工具
    在软件开发过程中,性能测试是确保应用程序能够高效运行的关键步骤。为了提供高质量的测试服务,许多企业正在寻求功能强大且易用的性能测试工具。RunnerGo是一个基于Go语言开发的性能测试平台,具有简单易用、高效稳定等特性,适用于API接口测试、场景测试、性能测试和接口自动化测试等全......
  • Go语言数字字面量
    在Go语言中,数字字面量可以用以下方式表示:二进制(Binary):使用0b或0B前缀。例如:b:=0b1010//10indecimal注意:这是在Go1.13及更高版本中引入的。八进制(Octal):使用0前缀。例如:o:=0644//420indecimal,oftenusedforfilepermissions十进......
  • 0x00 BabyDjango,启动
    0x00BabyDjango,启动新建项目此处我使用之前的解释器(主要是不想再从0到×再安装一些包,难受...)原先解释器中得先装好Django第三方库新建项目初始目录如下启动在终端中,指定地址和端口进行运行pythonmanage.pyrunserverip:portDjango项目结构说明一个常规目录......
  • rust vs GO:性能
    8月7日,Rust基金会发布了2022年度Rust调查报告结果,报告显示Rust采用率不断提高,超过90%的调查受访者表示自己是Rust用户;29.7%的受访者表示,他们在工作中的大部分编码工作都使用Rust,比上一年显着增加了51.8%。毋庸置疑,Rust以其卓越的内存安全性和并发性能正日益成......