#事件 #发射器 #并行 #未来 #事件监听器

parallel-event-emitter

基于futures-rs和futures-cpupool的并行事件发射器,用于并发调用事件监听器回调

8个版本

使用旧Rust 2015

0.2.4 2017年1月20日
0.2.3 2017年1月19日
0.1.2 2017年1月18日

并发中排名#851

MIT 许可证

32KB
348

并行事件发射器

一个事件发射器的实现,它在一个可配置的线程池中并发调用事件监听器回调,使用 Future 通知调用者成功或错误。

由于所有值都必须在线程边界之间传输,所有类型 T 必须是 Send

此外,所有类型 T 必须是 Any,所以 T: 'static

用法

[dependencies]
futures = "0.1"
parallel-event-emitter = "0.2.4"

使用 String 作为键的示例

extern crate futures;
extern crate parallel_event_emitter;

use futures::Future;
use parallel_event_emitter::*;

fn main() {
    let mut emitter: ParallelEventEmitter<String> = ParallelEventEmitter::new();

    emitter.add_listener("some event", || {
        println!("Hello, World!");

        Ok(())
    }).unwrap();

    assert_eq!(1, emitter.emit("some event").wait().unwrap());
}

或使用自定义事件类型

extern crate futures;
extern crate parallel_event_emitter;

use futures::Future;
use parallel_event_emitter::*;

#[derive(Debug, Hash, PartialEq, Eq, Clone)]
enum MyEvents {
    EventA,
    EventB,
}

fn main() {
    let mut emitter: ParallelEventEmitter<MyEvents> = ParallelEventEmitter::new();

    emitter.add_listener(MyEvents::EventA, || {
        println!("Hello, World!");

        Ok(())
    }).unwrap();

    assert_eq!(1, emitter.emit(MyEvents::EventA).wait().unwrap());
}

Trace<E> 类型

此crate依赖于trace-error crate,以便在所有错误 Result 上具有简单和轻量级的回溯。

如果您选择不使用它,这对我来说是可以的,只需在所有 Trace<E> 值上调用 .into_error() 即可获取真实错误。

impl Trait 功能

与所有 emit* 方法返回一个boxed Future (BoxFuture) 相比,Cargo功能 conservative_impl_trait 可以启用所有 emit* 方法的 impl Future 返回类型。

[dependencies.parallel-event-emitter]
version = "0.2.4"
features = ["default", "conservative_impl_trait"] # And maybe integer_atomics

更大的 ListenerId

虽然 ListenerId 类型本身是 u64,但底层的原子计数器默认情况下受限于 AtomicUsize

要启用真正的保证64位计数器,请使用crate的 integer_atomics 功能。

[dependencies.parallel-event-emitter]
version = "0.2.4"
features = ["default", "integer_atomics"] # And maybe conservative_impl_trait

依赖关系

~2.6–3.5MB
~73K SLoC