В Go синхронный сетевой API обычно паркует горутину через netpoll, позволяя потоку выполнять другую работу. Но настоящий блокирующий syscall или cgo может заблокировать поток ОС.
Если ты делаешь синхронный запрос в базу данных или соседний сервис, и запрос выполняется 5 секунд, что произойдёт с потоком операционной системы, на котором запущен сервис, пока выполняется запрос?
В Go синхронный сетевой API обычно паркует горутину через netpoll, позволяя потоку выполнять другую работу. Но настоящий блокирующий syscall или cgo может заблокировать поток ОС.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Go синхронный сетевой API обычно паркует горутину через netpoll, позволяя потоку выполнять другую работу. Но настоящий блокирующий syscall или cgo может заблокировать поток ОС.
Когда поток уходит в длительный системный вызов, runtime может передать право выполнения Go-кода другому потоку. Поэтому «синхронный вызов» не означает остановку всего сервиса на пять секунд. Поведение зависит от драйвера и вида I/O; файловые операции и внешние библиотеки не всегда устроены как стандартная сеть. Дедлайн и ограничение конкурентности всё равно необходимы.