#事件流 #事件 #异步 #多个 #消费者 #发布 #对象

async_event_streams

异步事件发布/订阅库

5个版本

0.1.4 2022年9月7日
0.1.3 2022年9月6日
0.1.2 2022年9月6日
0.1.1 2022年6月20日
0.1.0 2022年6月20日

#1553异步


2 个crate中使用 async_event_streams_derive)

MIT/Apache

26KB
413

异步事件流

用于使用异步流发布多个消费者的事件库

库提供了 EventStreams<T: 'static + Send + Sync> 对象,该对象将类型 T 的事件转换为任意数量的 EventStream 对象,这些对象实现了标准 futures::Stream 接口

使用示例

use futures::{executor::LocalPool, task::LocalSpawnExt, StreamExt};
use async_events::EventStreams;

let mut pool = LocalPool::new();

let streams = EventStreams::new();
let mut stream = streams.create_event_stream();

let sender_task = async move {
    assert!(streams.count() == 1);
    streams.send_event(42, None).await;
    streams.send_event(451, None).await;
    streams.send_event(1984, None).await;
};

let receiver_task = async move {
    let mut values = Vec::new();
    while let Some(event) = stream.next().await {
        values.push(*event)
    }
    // next() returns none when 'streams' is dropped
    assert!(values == vec![42, 451, 1984]);
};

pool.spawner().spawn_local(sender_task);
pool.spawner().spawn_local(receiver_task);
pool.run();

依赖关系

~5–15MB
~196K SLoC