Crates.io | async_tasks_recorder |
lib.rs | async_tasks_recorder |
version | 2.0.2 |
source | src |
created_at | 2024-02-19 02:50:51.801023 |
updated_at | 2024-02-23 09:58:37.580094 |
description | A struct for recording execution status of async tasks with async methods. |
homepage | |
repository | https://github.com/Ayana-chan/async_tasks_recorder |
max_upload_size | |
id | 1144625 |
size | 81,509 |
A struct for recording execution status of async tasks with async methods.
Functions:
Future
s and query whether they are not found, successful, failed, or running.Future
s to revoke the succeeded Future
s and make them not found.Dependency:
tokio
with feature rt
, so cannot use other async runtimes.HashSet
.Use this crate if:
task_id
(not necessarily String
) for a future (task).task_id
to succeed more than once.A recorder can only use one task_id
type. The type of task_id
should be:
Eq + Hash + Clone + Send + Sync + 'static
Arc
).Launch a task with a unique task_id
and a Future
by launch
.
Query the state of the task with its task_id
by query_task_state
or query_task_state_quick
.
Revoke a task with its task_id
and a Future
for revoking by revoke_task_block
.
Remember that you can add anything in the Future
to achieve the functionality you want.
For example:
Result
in Future
, and then return empty result Result<(),()>
.Future
to notify upper level that "this task done".
Don't forget to consider using tokio::spawn
when the channel may not complete sending immediately.It's still efficient to store metadata of tasks at external scc::HashMap
(task_id
-> metadata).
It is recommended to directly look at the source code (about 150 line) if there is any confusion.
The consumption of all operations in this crate and cloning times
is about two to three times that of the implementation using scc::Hashmap
.
This crate use three HashSet
to make it easy to operate all tasks in the same state,
And two more HashSet
for linearizability of query and supporting revoking operation.
Note that scc
's containers have less contention in single access when it grows larger.
Therefore, if you don't need operating every task in the same state,
then just use scc::HashMap
(task_id
-> task_status
) to build a simpler implementation,
which might have less contention and cloning, but more expansive to iterate.
And the scc::HashMap::update_async
could be a powerful tool for atomic operations.
You should also avoid using this crate if you just want to handle every task in only one state.
For example, if you just want to manage the failed tasks,
then you should use scc::HashMap
to record tasks' states,
and insert the failed tasks into an external Arc<scc::HashSet>
in Future
.
Version less than 1.1.1 has bugs.
For more usage, nature and proofs, please refer to Document.