Как Go обрабатывает сетевые I/O?

Middle+
568 просмотров
AFK Offer AI

Go превращает асинхронный I/O в синхронный код. Ты пишешь conn.Read() — и это выглядит блокирующим, но под капотом: если данных нет, горутина паркуется (gopark), сокет регистрируется в netpoller (epoll/kqueue). Когда данные приходят, netpoller вызывает goready и горутина просыпается. Системный тред при этом не блокируется — он подхватывает другую горутину. Для файлового I/O (который не поддерживает epoll) Go использует отдельный тредпул. Именно поэтому в Go не нужны async/await — рантайм делает это за тебя.

Следующий вопрос

Как реализовать поиск?