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个)

MIT OR Apache-2.0 OR Zlib

48KB
792 代码行

switchyard

GitHub Workflow Status Crates.io Documentation License

具有作业池、线程本地数据和优先级的实时计算重点异步执行器。

示例

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