3 unstable releases
0.2.1 | Dec 2, 2024 |
---|---|
0.2.0 | Dec 1, 2024 |
0.1.0 | Nov 14, 2024 |
#487 in Asynchronous
392 downloads per month
27KB
224 lines
miniloop - simple asynchronous executor
This repository is created as an attempt to clarify some more low-level details about how things work in Rust asynchronous world.
The miniloop
executor creates a statically allocated list of tasks. That number should be available upon a crate
build:
MINILOOP_TASK_ARRAY_SIZE
: default value is1
which means you can schedule a single task within the executor. To override that just define an environment variable with the number of tasks you plan to use in your application.
Configuration
You can set up the environment variable in a shell prior to running the cargo build
command:
- Linux
export MINILOOP_TASK_ARRAY_SIZE=10
- Windows
$env:MINILOOP_TASK_ARRAY_SIZE = 10
Or you can use configurable environment feature by
creating a .cargo/config.toml
file with the following content:
[env]
MINILOOP_TASK_ARRAY_SIZE = "10"
miniloop in action
Create your tasks on the stack, add them to the executor and enjoy!
use miniloop::executor::Executor;
use miniloop::helpers::yield_me;
fn sleep(s: u64) {
std::thread::sleep(std::time::Duration::from_secs(s));
}
async fn dummy_func(data: &str) {
const TICKS: usize = 4;
let mut counter = 0usize;
while counter != TICKS {
sleep(2);
let now = get_timestamp_sec();
println!("{now}: {data}");
yield_me().await;
counter += 1;
}
}
fn get_timestamp_sec() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs()
}
fn pending_print(task_name: &str) {
let now = get_timestamp_sec();
println!("{now}: Task {task_name} is pending. Waiting for the next tick...");
}
fn main() {
let mut executor = Executor::new();
executor.set_pending_callback(pending_print);
let mut binding1 = async {
dummy_func("hello").await;
};
let mut binding2 = async {
dummy_func("world").await;
};
let _ = executor.spawn("hello", &mut binding1);
let _ = executor.spawn("world", &mut binding2);
executor.run();
println!("Done!");
}
License
This project is licensed under Apache License, Version 2.0Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in time by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.