Tokio dominates async Rust, but its epoll-based model makes it hard to adopt io_uring. This talk explains why async Rust’s design creates that friction and introduces an approach to support both I/O models: switching runtimes at compile time. With this method, I/O middleware can work with epoll and io_uring without changing its code.