6 个版本
0.2.2 | 2021 年 9 月 19 日 |
---|---|
0.2.1 | 2021 年 9 月 17 日 |
0.1.2 | 2021 年 9 月 17 日 |
#562 在 并发
每月 31 次下载
17KB
339 行
Nysa
为应用程序中独立的子系统之间传递消息的通道。
use std::time::Duration;
use nysa::global as bus;
enum Add {
Two(i32, i32),
Quit,
}
struct AdditionResult(i32);
fn main() {
let adder = std::thread::spawn(move || loop {
match bus::wait_for::<Add>().consume() {
Add::Two(a, b) => bus::push(AdditionResult(a + b)),
Add::Quit => break,
}
});
bus::push(Add::Two(1, 2));
std::thread::sleep(Duration::from_secs(1));
bus::push(Add::Two(4, 5));
std::thread::sleep(Duration::from_secs(1));
bus::push(Add::Quit);
adder.join().unwrap();
for message in &bus::retrieve_all::<AdditionResult>() {
let AdditionResult(x) = message.consume();
println!("{}", x);
}
}
什么是 nysa?
Nysa 是一个线程安全的消息通道,适用于应用程序。
它提供了一个安全且易于使用的 API,同时抽象掉了互斥锁和条件变量的所有复杂细节。
nysa 的主要用途是桌面应用程序,这些应用程序依赖于许多子系统相互通信以下载、处理、转换、计算数据。每个子系统都可以在通道上等待消息到达,然后将更多消息推送到通道。
nysa 的核心思想是 保持简单,愚蠢。对于 nysa,代码可读性比惊人的性能更重要。使应用程序使用多个线程不应该是一项非常困难的任务。
这也是为什么 nysa 在 nysa::global
模块中暴露了一个 "默认" 静态通道的原因。仅使用这个通道对于大多数应用程序应该足够了,但如果性能成为问题,可以在子系统内部创建多个较小的通道来协调子子系统。
nysa 不是什么
- nysa 并不适合 I/O 密集型任务。对于这些任务,你应该使用异步分发器,如 tokio。
- nysa 不是一个生产级软件。它是一个玩具项目,作为我的协作绘画应用程序 NetCanv 的组件构建。也许有一天我会自信地发布 1.0 版本,但我怀疑它永远不会发生。
- nysa 没有经过实战测试。如果您遇到以
data race:
开头的 panic 信息,请报告一个错误。
名字的含义是什么?
这个名字是对旧波兰货车 ZSD Nysa 的怀旧,这是在波兰人民共和国时期制造的。其中一种变体是微型巴士,这正是这个库名字的由来。