Горутины: состояния горутин
Последний пример главы о конкурентной синхронизации показывает, что живая горутина может оставаться) в двух состояниях и переключаться между ними. Это состояния «работает» и «блокируется». В этом примере основная горутина переходит в состояние блокировки при wg.Wait вызове метода и снова переходит в рабочее состояние, когда две другие горутины завершают свои соответствующие задачи.
На следующем рисунке показан возможный жизненный цикл горутины.
Обрати внимание, что горутина по-прежнему считается «работающей», если она находится в спящем режиме (после вызова time.Sleep функции) или ожидает ответа системного вызова или сетевого подключения.
Когда создается новая горутина, она автоматически переходит в состояние «работает». Горутины могут выйти только из рабочего состояния и никогда — из состояния блокировки. Если по какой-либо причине горутина навсегда останется в заблокированном состоянии, она никогда не выйдет. Таких случаев, за исключением некоторых редких, следует избегать в конкурентном программировании.
Блокирующая горутина может быть разблокирована только операцией, выполненной в другой горутине. Если все горутины в программе Go находятся в состоянии блокировки, то все они останутся в состоянии блокировки навсегда. Это можно рассматривать как общий тупик. Когда это происходит в программе, стандартная среда выполнения Go попытается сломать программу.
Следующая программа рухнет через две секунды.
Пришло время поработать с кодом!
Выход.