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.
С помощью каналов часто легко понять, что вызвало тупик. С другой стороны, программы, которые интенсивно используют мьютексы, могут быть очень сложными для отладки.
Читайте также:
Комментариев нет:
Отправить комментарий