select! is full of footguns. Avoid it as much as possible.
Instead of loop { select! { a b } } use join!(async { loop a }, async { loop b }). If you have to interleave different kinds of work in the same loop, use enum Message with for msg in channel { match msg { a b } }.