Гонки данных могут происходить легко и их трудно отлаживать. К счастью, среда выполнения Go часто может помочь.
Используйте -race, чтобы включить встроенный детектор гонки данных.
$ go test -race [packages]
$ go run -race [packages]
Пример
Вот программа с гонкой данных:
package main
import "fmt"
func main() {
i := 0
go func() {
i++ // запись
}()
fmt.Println(i) // конкурентное чтение
}
Запуск этой программы с опцией -race говорит нам о гонке между записью в строке 7 и чтением в строке 9:
$ go run -race main.go
0
==================
WARNING: DATA RACE
Write by goroutine 6:
main.main.func1()
/tmp/main.go:7 +0x44
Previous read by main goroutine:
main.main()
/tmp/main.go:9 +0x7e
Goroutine 6 (running) created at:
main.main()
/tmp/main.go:8 +0x70
==================
Found 1 data race(s)
exit status 66
Детали
Детектор гонки данных не выполняет статический анализ. Он проверяет доступ к памяти во время выполнения и только для путей кода, которые фактически выполняются.
Он работает на darwin/amd64, freebsd/amd64, linux/amd64 и windows/amd64.
Накладные расходы варьируются, но обычно увеличивается объем используемой памяти в 5-10 раз, а время выполнения увеличивается в 2-20 раз.
Читайте также:
- Модель памяти Go
- Состояния гонки в Golang
- Работа с гонками данных (data race) в Golang
- Гонки данных в Golang простыми словами
Комментариев нет:
Отправить комментарий