Skip to content

Горутины: состояния горутин

Последний пример главы о конкурентной синхронизации показывает, что живая горутина может оставаться) в двух состояниях и переключаться между ними. Это состояния «работает» и «блокируется». В этом примере основная горутина переходит в состояние блокировки при wg.Wait вызове метода и снова переходит в рабочее состояние, когда две другие горутины завершают свои соответствующие задачи.

На следующем рисунке показан возможный жизненный цикл горутины.

Обрати внимание, что горутина по-прежнему считается «работающей», если она находится в спящем режиме (после вызова time.Sleep функции) или ожидает ответа системного вызова или сетевого подключения.

Когда создается новая горутина, она автоматически переходит в состояние «работает». Горутины могут выйти только из рабочего состояния и никогда — из состояния блокировки. Если по какой-либо причине горутина навсегда останется в заблокированном состоянии, она никогда не выйдет. Таких случаев, за исключением некоторых редких, следует избегать в конкурентном программировании.

Блокирующая горутина может быть разблокирована только операцией, выполненной в другой горутине. Если все горутины в программе Go находятся в состоянии блокировки, то все они останутся в состоянии блокировки навсегда. Это можно рассматривать как общий тупик. Когда это происходит в программе, стандартная среда выполнения Go попытается сломать программу.

Следующая программа рухнет через две секунды.

Пришло время поработать с кодом!

Выход.