#bus #applications #message-bus #subsystem #independent #global #push

nysa

为应用程序中独立的子系统之间传递消息的通道

6 个版本

0.2.2 2021 年 9 月 19 日
0.2.1 2021 年 9 月 17 日
0.1.2 2021 年 9 月 17 日

#562并发

每月 31 次下载

MIT 许可协议

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 的怀旧,这是在波兰人民共和国时期制造的。其中一种变体是微型巴士,这正是这个库名字的由来。

依赖关系