Sobes.tech
Назад к вопросам
Senior
7

Что такое Netpoller? Зачем он нужен и как горутины попадают туда и возвращаются обратно?

Компании, где спрашивали
техвил

Ответ от нейросети

sobes.tech AI

Netpoller в Go — это механизм, который реализует неблокирующий ввод-вывод на уровне операционной системы, используя системные вызовы вроде epoll (Linux), kqueue (BSD/macOS) или IOCP (Windows). Он нужен для эффективного управления большим числом сетевых соединений без блокировки потоков.

Как это работает:

  • Горутины, выполняющие операции ввода-вывода, регистрируются в netpoller.
  • Когда горутина пытается читать или писать, если операция не готова (например, нет данных для чтения), она блокируется и передаётся в netpoller.
  • Netpoller отслеживает события ввода-вывода через системные вызовы и уведомляет планировщик Go, когда операция готова.
  • Планировщик разблокирует горутину, и она продолжает выполнение.

Таким образом, горутины не блокируют системные потоки, а переключаются по событиям ввода-вывода, что позволяет эффективно масштабировать сетевые приложения.

Примерно это выглядит так (упрощённо):

// Горутина пытается читать из сетевого соединения
n, err := conn.Read(buf)
// Если данных нет, горутина блокируется и регистрируется в netpoller
// Netpoller ждёт события готовности чтения
// Когда данные появляются, горутина разблокируется и продолжает работу

Внутри runtime Go этот процесс автоматизирован и прозрачен для разработчика.