If you don't block or use async notifications you are "busy-waiting" and that's very bad: sucking up 100% of the CPU doing nothing. If your program's reason for existence is to read from any of one-or-more sockets and to write its output somewhere else,
block? It becomes a classic "select()" scenario. After all, your program has nothing to do until the next message(s) come in.