вторник, 24 марта 2020 г.

Как отлаживать deadlocks в Golang

Deadlock возникает, когда группа goroutines ждет друг друга, и ни одна из них не может продолжить.

Взгляните на этот простой пример.

func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch)
}

Программа застрянет на операции отправки в канал, ожидая, когда кто-то прочтет значение. Go может обнаруживать подобные ситуации во время выполнения. Вот вывод от нашей программы:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    .../deadlock.go:7 +0x6c

Советы по отладке

goroutine может застрять

  • либо потому, что она ждет канал (channel)
  • либо потому, что она ожидает одну из блокировок (lock) в пакете sync.

Общие причины в том, что

  • ни одна другая goroutine не имеет доступа к каналу или блокировке (lock),
  • группа goroutines ждут друг друга, и никто из них не может продолжить.

В настоящее время Go определяет только, когда программа в целом зависает, а не когда застревает подгруппа goroutines.

С помощью каналов часто легко понять, что вызвало тупик. С другой стороны, программы, которые интенсивно используют мьютексы, могут быть очень сложными для отладки.


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий