在Rust中是否有NodeJS的EventEmitterfunction?

我正在寻找一个中心的“对象”,多个任务可以“订阅”asynchronous更新消息。

据我所知, EventEmitter只是事件监听器支持的通用接口; 实现这个接口的对象提供了几种事件,客户端代码可以在这些事件上放置监听器callback。 这些callback将在相应事件发出时被调用。 由于JS是dynamictypes语言,这样的接口很自然地产生,可以被很多东西实现。

首先,NodeJS和Rust都不能“订阅”任务/线程:你在某个对象上放置了一个侦听器callback函数,然后这个callback函数将从某个线程调用,甚至可能是当前调用线程,但是一般来说线程其中订阅了一个对象,并且这个callback将在其中运行的线程是不同的。 在NodeJS中,有一个全局事件循环,它调用函数和外部事件监听器,这些事件监听器又可以调用其他事件监听器,所以你不知道哪个线程将执行监听器。 不是你应该关心 – 事件循环抽象隐藏你的显式线程。

然而,Rust是一种适当的multithreading语言。 它不会运行在全局事件循环上(尽pipe通过libgreen可以 – 但是在类似于Node中的事件循环中运行Rust程序;它将用于任务pipe理和I / O处理,但它会在不久的将来与libstd分离)。 默认的Rust运行时, libnative ,公开了用于创build本地预先调度线程和本地I / O的工具。 这意味着哪个线程最终执行callback并不重要,您应该记住所有callback将在拥有对象的线程中执行,除非它专门为事件处理创build单独的线程。

听众的另一个问题是Rust是静态types语言,在静态types语言中编写通用事件监听器接口比在dynamictypes语言中要困难得多,因为你需要编写一个足够多态的接口。 你也想利用强大的types系统,并尽可能保证你的接口types安全。 这不是一个微不足道的任务。 当然,在Box<Any>地方都可以使用Box<Any> ,但是这样的API不会很愉快。

所以,目前没有通用的事件监听器接口。 没有活动巴士图书馆。 不过,你总是可以自己写点东西。 如果不是非常通用的话,写起来应该不是很困难。