Городунам не принадлежат каналы или значения, отправленные по ним.Таким образом, состояние выполнения программы, которая отправила / отправляет значения по каналу, не влияет на способность других программ отправлять или получать значения по этому каналу, если только буфер канала не заполнен, и в этом случае все отправки блокируются.пока соответствующий прием не произойдет, или буфер не будет пуст, в этом случае все приемы будут блокироваться, пока не будет соответствующая отправка.
Поскольку подпрограммы используют совместное планирование (они должны уступать планировщику либо через каналОперация, системный вызов или явный вызов runtime.Gosched()
) не позволяют прерывать выполнение процедуры в «наихудшее возможное время».Для goroutine возможно никогда не дать, в этом случае, это может связать нить на неопределенный срок.Если у вас есть только один поток выполнения, то другие ваши подпрограммы никогда не будут запланированы.Возможно, но статистически маловероятно, чтобы горутин просто никогда не был запланирован.Однако, если все процедуры, кроме одной, заблокированы при отправке или получении, то оставшаяся процедура должна быть запланирована.
Возможно получить тупик.Если у меня выполняется две подпрограммы:
func Goroutine(ch1, ch2 chan int) {
i := <-ch1
ch2 <- i
}
...
ch1, ch2 := make(chan int), make(chan int)
go Goroutine(ch1, ch2)
go Goroutine(ch2, ch1)
Тогда, как должно быть очевидно, обе подпрограммы ждут, пока другая отправит значение, что никогда не произойдет.