If one stream is always ready, then the future just keeps running. The choice of executor doesn't have anything to do with it. You could write a little future that "yields" back to the executor by returning Pending once and then Ready to cooperatively allow other futures to run and call that periodically. Tokio has one, but it's not runtime specific so that could easily move to the futures crate: yield_now.rs.html -- source