Expand description
A safe Rust async runtime.
Features
forbid(unsafe_code)
- Depends only on
std
- Good test coverage (>95%)
Limitations
- Building on
stable
requiresonce_cell
crate which contains some unsafe code. This is necessary untilstd::lazy::OnceCell
is stable. - Allocates memory. You can avoid allocations by using advanced functions, like
safina_executor::spawn_unpin
. - Not optimized
Documentation
safina_async_test
has an #[async_test]
macro for running async fn
test functions.
Examples
let executor = safina::Executor::default();
let (sender, receiver) = std::sync::mpsc::channel();
executor.spawn(async move {
sender.send(()).unwrap();
});
receiver.recv().unwrap();
let result = safina::block_on(async {
prepare_request().await?;
execute_request().await
})?;
Alternatives
smol
- Popular
- Contains generous amounts of
unsafe
code
async-std
- Very popular
- Contains generous amounts of
unsafe
code
futures
- Very popular
- Contains generous amounts of
unsafe
code
tokio
- Very popular
- Fast
- Internally extremely complicated
- Full of
unsafe
bastion
- Generous amounts of
unsafe
code
- Generous amounts of
nostd_async
Changelog
- v0.2.1 - Update docs.
- v0.2.0
Executor::new
andExecutor::with_name
to returnResult
.ThreadPool::new
to returnResult
.ThreadPool::try_schedule
to return an error when it fails to restart panicked threads.ThreadPool::schedule
to handle failure starting replacement threads.
- v0.1.10 -
block_on
functions to take futures that are notSend
. - v0.1.9 - Use
once_cell
by default. - v0.1.8 - Support stable with rust 1.51 and
once_cell
. - v0.1.7 - Add
safina-net
- v0.1.6 - Use
safina-executor
v0.1.3 API - v0.1.5 - Add
safina_sync::Mutex
- v0.1.4 - Upgrade to new safina-executor version which removes need for
Box::pin
. - v0.1.3 - Update docs
- v0.1.2 - Renamed
safina
crate tosafina-executor
. Added newsafina
crate with re-exports, examples, and integration tests. - v0.1.1 - Add badges to readme
- v0.1.0 - First published version
TO DO
- Add
init
function that makes an executor and starts the timer thread. - Add an
#[async_main]
macro
Release Process
- Edit
Cargo.toml
and bump version number. - Run
./release.sh
Structs
A future wrapper that returns DeadlineExceeded
at a specified deadline.
A collection of threads for executing tasks and blocking jobs.
A wrapper around
std::sync::Mutex
with an async lock
method.
A future that polls two futures and returns the value from the one that completes first.
A future that completes after the specified time.
Async wrapper around
std::net::TcpListener
.
Guard returned by set_thread_executor
.
Call start_timer_thread
to prevent this error.
Enums
DeadlineError::TimerThreadNotStarted
DeadlineError::DeadlineExceeded
Functions
Executes the future on the current thread and returns its result.
Executes the future on the current thread and returns its result.
Gets the Executor
from thread-local storage.
Schedules f
to run on any available thread in the blocking thread pool.
Awaits both futures and returns the value from the one that completes first.
Awaits the futures and returns the value from the one that completes first.
Awaits the futures and returns the value from the one that completes first.
Awaits the futures and returns the value from the one that completes first.
Sets executor
as the Executor
for the current thread,
saving it to thread-local storage.
Returns duration
time from now.
Returns after deadline
.
Creates a new task to execute fut
and schedules it for immediate execution.
Creates a new task to execute fut
and schedules it for immediate execution.
Starts the worker thread, if it’s not already started.
You must call this before calling sleep_until
or sleep_for
.
Awaits inner
, but returns DeadlineExceeded
after deadline
.
Awaits inner
, but returns DeadlineExceeded
after duration
time from now.