Жаль, что нет логики как с сокетами: блокироваться и ждать, пока не появится что-нибудь в буфере.
С сокетами в конечном итоге асинхронные циклы тоже делают по сути просто select на каждом проходе, когда очередной асинк-обработчик передаёт управление обратно в цикл, т.е. пусть там и нет sleep, но логика реальной долбёжки polling'ом вполне на лицо
В асинхронном лупе нет никакой долбежки, иначе он бы жрал 100% проца всегда.
Луп засыпает в epoll/kqueue/etc пока не появятся данные в одном из сокетов. (Или пока таймер не наступ время вызвать)