5个不稳定版本
0.3.0 | 2022年6月15日 |
---|---|
0.2.1 | 2021年4月10日 |
0.2.0 | 2021年3月28日 |
0.1.1 | 2020年11月21日 |
0.1.0 | 2020年11月3日 |
#1565 in 异步
在 3 个crate中使用 (直接使用2个)
48KB
792 代码行
switchyard
具有作业池、线程本地数据和优先级的实时计算重点异步执行器。
示例
use switchyard::Switchyard;
use switchyard::threads::{thread_info, one_to_one};
// Create a new switchyard without thread local data
let yard = Switchyard::new(one_to_one(thread_info(), Some("thread-name")), ||()).unwrap();
// Spawn a task on priority 10 and get a JoinHandle
let handle = yard.spawn(10, async move { 5 + 5 });
// Spawn a lower priority task
let handle2 = yard.spawn(0, async move { 2 + 2 });
// Wait on the results
assert_eq!(handle.await + handle2.await, 14);
Switchyard的独特之处
Switchyard与其他现有的异步执行器不同,专注于需要精确控制线程和执行顺序的情况。其中一种情况是使用任务并行化来并行化计算工作负载。
优先级
每个任务都有一个优先级,任务按从高优先级到低优先级的顺序执行。
// Spawn task with lowest priority.
yard.spawn(0, async move { /* ... */ });
// Spawn task with higher priority. If both tasks are waiting, this one will run first.
yard.spawn(10, async move { /* ... */ });
线程本地数据
每个yard都有一些线程本地数据,可以使用 spawn_local
访问。线程本地数据和传递给 spawn_local
的异步函数生成的future都可以是 !Send
和 !Sync
。future只会在创建它的线程上恢复。
如果数据是 Send
,则可以调用 access_per_thread_data
来获取指向所有线程数据的可变引用的向量。请参阅其文档以获取更多信息。
// Create yard with thread local data. The data is !Sync.
let yard = Switchyard::new(one_to_one(thread_info(), Some("thread-name")), || Cell::new(42)).unwrap();
// Spawn task that uses thread local data. Each running thread will get their own copy.
yard.spawn_local(0, |data| async move { data.set(10) });
MSRV
1.51
未来MSRV升级将是破坏性更改。
许可证:MIT OR Apache-2.0 OR Zlib
依赖项
~2.2–9.5MB
~82K SLoC