Горутина, вызванная в методе, определенном в пакете, не запускается

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

Вот структура моей примерной программы:

sample
├── abc
│   └── abc.go
└── main.go

А ниже приведен исходный код abc.go и main.go.

abc.go

1 package abc
2 
3 import (
4   "fmt"
5 )
6 
7 func PrintCde() {
8   fmt.Println("Cde")
9 }
10 
11 
12 type Abc struct {}
13 
14 func (a Abc)PrintAbc() {
15   fmt.Println("Abc")
16   go PrintCde()
17   for {}
18 }

main.go

1 package main
2 
3 import (
4   "sample/abc"
5 )
6 
7 func main() {
8   var a abc.Abc
9   a.PrintAbc()
10 
11 }

Затем, если я запускаю программу, я никогда не получаю строку «Cde», напечатанную на экране.

Я могу предположить, что цикл for в методе PrintAbc занимает вычислительные ресурсы, а функция PrintCde никогда не планировалась для запуска.

Если это причина, есть ли какие-либо другие способы предотвратить повторный запуск метода PrintAbc, но не занимать ресурсы для запуска функции printCde?


person Janus.Le    schedule 24.06.2014    source источник


Ответы (1)


Да, пустое/бесконечное for обычно вызывает эту проблему. Для этой цели используйте пустую операцию select{}, которая вместо этого является блокирующей операцией и побуждает/заставляет среду выполнения менять местами горутины. Другие варианты включают увеличение GOMAXPROCS или (в реальной программе) использование чего-то вроде sync.WaitGroup для ожидания завершения обработки другой горутиной перед естественным завершением программы.

person LinearZoetrope    schedule 24.06.2014
comment
Я использую sync.WaitGroup, чтобы повесить сервер сейчас! Большое спасибо. - person Janus.Le; 26.06.2014