tgoop.com/go_interview_lib/370
Create:
Last Update:
Last Update:
💬 Почему важно следить за временем жизни горутин и как мы можем избежать проблем с утечкой памяти в Go?
Потому что каждая горутина занимает определенное количество памяти для своего стека. Если горутина продолжает работать бесконечно или не завершается корректно, это может привести к утечке памяти и повышенному использованию ресурсов.
📌 Чтобы избежать проблем с утечкой памяти, необходимо:
1. Использовать контексты (context.Context
): контексты позволяют контролировать время выполнения горутины и отменять её выполнение, когда это необходимо. Например, использование select
с контекстом позволяет горутине завершиться корректно при получении сигнала отмены:
func Job(ctx context.Context, d time.Duration) {
for {
select {
case <-ctx.Done():
return
default:
...
time.Sleep(d)
}
}
}
2. Закрывать каналы: если горутина читает данные из канала, важно корректно закрывать этот канал, чтобы горутина завершалась и не зависала бесконечно.
func worker(jobs <-chan int) {
for i := range jobs {
...
}
}
jobs := make(chan int)
go worker(jobs)
// Закрытие канала, когда работа завершена
close(jobs)
3. Избегать использования
time.Sleep()
без контекста: функция time.Sleep()
не поддерживает прерывания и может привести к зависанию горутины, если её необходимо завершить. Вместо этого используйте конструкции, учитывающие контекст, такие как time.After
с select
.BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/370