Golang. Ошибка записи в канал
В приложении в одной части в канал пишутся данные через горутину. В другой части эти данные считываются.
При прерывании работы программы, возникает ошибка с записью в канал. Получается, что система держит N потоков с одной строчкой ch <- data в ожидании выполнения. Если до того, как все данные будут обработаны, прервать работу приложения, то возникает panic.
Что ещё интереснее, recovery() не помог решить вопрос с panic.
Если чтение из канала ещё можно проверить так - data, ok := <- ch, то как обработать ошибку записи в канал? И можно ли?
Ответы (2 шт):
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 не срабатывает.
В моём случае помогло создание буферизированного канала на нужное число записей. Это избавило от оборачивания в горутину и создания множества потоков.