Golang на VS Code и обнаружение DeadLock
Осваиваю язык Golang по видеоурокам. У лектора используется IDE от JetBrains и при изучении темы посвящённой deadlock в следующем коде у него выводится ошибка:
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type Worker struct {
id int
die chan bool
*sync.WaitGroup
}
func (w *Worker) DoWork() <-chan string {
c := make(chan string)
go func() {
for {
select {
case <-time.After(time.Duration(rand.Intn(1000)) * time.Millisecond):
c <- fmt.Sprintf("Worker #%d, do some work - %d", w.id, rand.Intn(100))
case <-w.die:
fmt.Println("Finish work")
return
}
}
}()
return c
}
func (w *Worker) Die() {
fmt.Printf("Worker die %d\n", w.id)
w.die <- true
w.Done()
close(w.die)
}
func NewWorker(id int, wg *sync.WaitGroup) *Worker {
die := make(chan bool,1) // <-- Если канал не буферизированный, то будет deadlock
wg.Add(1)
return &Worker{id, die, wg}
}
func main() {
var wg sync.WaitGroup
w1 := NewWorker(1, &wg)
w2 := NewWorker(2, &wg)
res1 := w1.DoWork()
res2 := w2.DoWork()
for i := 0; i < 6; i++ {
fmt.Println(<-res1)
fmt.Println(<-res2)
}
w1.Die()
w2.Die()
wg.Wait()
}
fatal error: all goroutines are asleep - deadlock!
У меня же на VS Code такая ошибка не выходит. Просто поток перестаёт отвечать и всё. Как включить отображение подобной ошибки на VS Code?
golang:
go version go1.17.2 windows/amd64
VS code:
Версия: 1.62.2 (user setup)
Фиксация: 3a6960b964327f0e3882ce18fcebd07ed191b316
Дата: 2021-11-11T20:56:38.428Z
Electron: 13.5.2
Chrome: 91.0.4472.164
Node.js: 14.16.0
V8: 9.1.269.39-electron.0
ОС: Windows_NT x64 10.0.19043
Ответы (1 шт):
Ответ в том, что ТС в VS Code запускал программу кнопкой F5, то есть в отладчике. Отладчик доходит до фатальной ошибки и останавливается. ТС не обратил внимание, что на панели отладки показывается остановка программы. Если нажать кнопку "Продолжить", то программа выведет сообщение об ошибке и завершится.
Если же запустить программу по Ctrl-F5, то программа будет запущена без отладки и дойдёт до конца (т.е. сообщения о дедлоке) без остановок.