Golang. Ошибка записи в канал

Рейтинг: 1Ответов: 2Опубликовано: 01.08.2025

В приложении в одной части в канал пишутся данные через горутину. В другой части эти данные считываются.

При прерывании работы программы, возникает ошибка с записью в канал. Получается, что система держит N потоков с одной строчкой ch <- data в ожидании выполнения. Если до того, как все данные будут обработаны, прервать работу приложения, то возникает panic.

Что ещё интереснее, recovery() не помог решить вопрос с panic.

Если чтение из канала ещё можно проверить так - data, ok := <- ch, то как обработать ошибку записи в канал? И можно ли?

Ответы

▲ 0

recover в действительности перехватывает ошибки записи в закрытый канал.

package main

import (
    "fmt"
    "sync"
)

func writer(n int, ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Recovered in writer: %#v\n", r)
        }
    }()
    for i := 0; i < n; i++ {
        ch <- i
    }
}

func main() {
    ch := make(chan int, 1)
    close(ch)
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go writer(10, ch, wg)
    wg.Wait()
}

Результат выполнения

Recovered in writer: "send on closed channel"

Покажите пример, в котором recover не срабатывает.

▲ 0

В моём случае помогло создание буферизированного канала на нужное число записей. Это избавило от оборачивания в горутину и создания множества потоков.