Asynchronous APIs for thread/multiprocessing/subinterpreter queues

Asyncio is very useful for the parts of your program that needs to do wait-intensive IO efficiently and makes it very easy to reason about critical sections compared to threading.

The downside is that it is contagious, and the standard escape hatch in many languages is to confine it to the worker that does IO and have it communicate via message passing with the workers whose work does not involve waiting for things. In Rust for example, the standard pattern is to use tokio channels and have worker threads use blocking_send while the IO workers use the non-blocking recv which is async.

The inconvenient part of doing this in python is that the asyncio queue is separate from the threading & multiprocessing ones. Maybe the latter should have a nonblocking fifo-preserving API in addition to the blocking one?