Взаимная блокировка в GoLang: зачем использовать диапазон за буферизованным каналом?
При использовании буферизованных каналов в GoLang важно избегать возникновения тупиковой ситуации . Недавняя проблема вызвала обеспокоенность по поводу взаимоблокировки, возникшей при попытке пройти через буферизованный канал после завершения всех горутин.
Приведенный код пытается использовать буферизованный канал емкостью 4 и порождает 4 горутины, которые отправляют данные. на канал. Однако тупиковая ситуация возникает из-за того, что:
Решение 1. Увеличьте размер канала и закройте его после завершения
Чтобы устранить взаимоблокировку, канал можно увеличить в размере и закрыть после завершения всех горутин:
ch := make(chan []int, 5)
...
wg.Wait()
close(ch)
Однако это устраняет преимущества конвейерной обработки, поскольку предотвращает печать до тех пор, пока не будут завершены все задачи.
Решение 2. Завершение сигнала из процедуры печати
Чтобы включить фактическую конвейерную обработку, функцию Done() можно вызвать в процедуре печати:
func main() {
ch := make(chan []int, 4)
...
go func() {
for c := range ch {
fmt.Printf("c is %v\n", c)
wg.Done()
}
}()
...
}
Этот подход гарантирует, что функция Done() вызывается только после печати каждого элемента, что фактически сигнализирует о завершении каждой горутины.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3