«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать тупика при использовании буферизованного канала в GoLang?

Как избежать тупика при использовании буферизованного канала в GoLang?

Опубликовано 2 ноября 2024 г.
Просматривать:406

How to Avoid Deadlock When Ranging Over a Buffered Channel in GoLang?

Взаимная блокировка в 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