selectme
A fast and fair select! implementation for asynchronous programming.
See the select! or inline! macros for documentation.
Usage
Add the following to your Cargo.toml
:
= "0.7.1"
Examples
The following is a simple example showcasing two branches being polled concurrently. For more documentation see select!.
async ! ;
async
select
Entrypoint macros
This crate provides entrypoint attributes which are compatible with the ones
provided by Tokio through #[selectme::main]
and
#[selectme::test]
with one exception. They do not check
(because they cannot) which Tokio features are enabled and simply assumes
that you want to build a multithreaded runtime unless flavor
is specified.
So why does this project provide entrypoint macros? Well, there's a handful
of issues related to performance and ergonomics which
turns out to be quite hard to fix in Tokio proper since backwards
compatibility needs to be maintained. So until a Tokio 2.x
is released and
we can bake another breaking release. Until such a time, you can find those
macros here.
The inline!
macro
The inline! macro provides an inlined variant of the select! macro.
Instead of awaiting directly it evaluates to an instance of the Select or StaticSelect allowing for more efficient multiplexing and complex control flow.
When combined with the static;
option it performs the least amount of
magic possible to multiplex multiple asynchronous operations making it
suitable for efficient and custom abstractions.
use Duration;
use time;
async
let output = inline! .await;
match output
The more interesting trick is producing a StaticSelect through the
static;
option which can be properly named and used inside of another
future.
use Future;
use Pin;
use ;
use Duration;
use pin_project;
use ;
use ;
let s1 = sleep;
let s2 = sleep;
let my_future = MyFuture ;
assert_eq!;