Is there an easy way to have a channel that sends in blocking mode, receives in async mode?

IIRC everything in tokio::sync is runtime agnostic.

Edit: While not stated explicitly in the docs, I found a reference:

That said, some utilities do not need external code: For example a channel can coordinate the two halves and make one half wake the other half up, meaning that no external code is needed to handle that situation. In fact the entire tokio::sync module is executor agnostic for this reason. Additionally the entire futures crate provides exclusively executor agnostic utilities.