Предположим, что программа читает из сети. Каждый раз, когда программа должна ждать (блокируется в ожидании ответа сети), что происходит? Поток ОС, выполняющий программу, блокируется? Или это работает как асинхронная операция c в C# (где поток возвращается в пул потоков, пока поток ввода-вывода операционной системы не уведомит программу о новых данных для обработки, а затем - другой поток из потока пул продолжает обрабатывать данные, полученные из сети)?
Мое основное беспокойство заключается в том, что если Go сохраняет заблокированный поток каждый раз, когда подпрограмма блокируется, если у меня много подпрограмм на сервере, обрабатывающем входящие соединения от очень медленная сеть, у меня может закончиться нехватка ОЗУ, поскольку каждый из этих заблокированных потоков потребляет около 2 МБ ОЗУ. Или, если у пула потоков, созданного Go для запуска goroutines, есть предел, у меня может закончиться нехватка жизнеспособности.
Так как же работают goroutines в операциях, связанных с IO?