У меня есть горутина, которая бесконечно проигрывает звук play()
. Чтобы сохранить play()
в живых, у меня есть вызывающая функция, которая после этого запускает бесконечный цикл for.
Неожиданно то, что цикл barebones, похоже, не позволяет функции работать бесконечно, и я не понимаю, почему. Однако, если я добавлю простой time.Sleep(time.Second)
в тело цикла for, он будет работать бесконечно. Есть идеи, почему?
Чтобы визуализировать:
func PlaysForAFewSeconds() {
go play()
for {
}
}
^ играет несколько секунд, но никогда не прерывается
func PlaysForever() {
go play()
for {
time.Sleep(time.Second)
}
}
^ играет вечно.
Я предполагаю, что это как-то связано с реализацией play()
, но я надеюсь, что это достаточно распространенная проблема, чтобы кто-то распознал этот симптом. Спасибо.
play()
блокирует, просто запустите его без горутин. - person zerkms   schedule 26.04.2019runtime.GOMAXPROCS
вручную? - person zerkms   schedule 26.04.2019fmt.Println()
внутри цикла позволяет ему воспроизводиться непрерывно. Я просто почесал в затылке, почему это не сработает. Спасибо. @zerkms И не волнуйтесь, я не буду использовать приведенный выше код :) - person Lucian Thorr   schedule 26.04.2019fmt.Println
(если вы не измените средство записи по умолчанию) вызывает системный вызов, который является безопасной точкой, поэтому, вероятно, это как-то связано с тем, что планировщик не может работать должным образом в этих обстоятельствах. - person zerkms   schedule 26.04.2019for {}
- это плохо. Если вы хотите когда-либо заблокировать подпрограмму на неопределенный срок и не создавать замкнутый цикл, расходующий ресурсы ЦП, используйте вместо этогоselect {}
. - person colm.anseo   schedule 26.04.2019