#plugin #message #tokio #plugin-system

message_plugins

Rust 插件面向消息传递的骨干库

4 个版本

0.2.0 2020年7月5日
0.1.2 2020年7月4日
0.1.1 2020年7月4日
0.1.0 2020年7月4日

#28#plugin-system

MPL-2.0 许可证

14KB
183

面向消息传递的插件架构

即使将插件限制在 Rust 中,插件也可能很复杂,通常需要大量工作来确保它们是内存安全的,API的可选部分不会破坏宿主,当然,类型可以自由地跨越 FFI 接口,因为 Rust 还没有稳定的 ABI。

该 crate 旨在为 Rust 插件和宿主之间提供一个简单的桥梁:使用 Rust 编写您的插件,确保它实现了 Plugin<T>(只有一个方法需要实现 :D),并构建一个包含单个必需函数的 dll:一个构造函数,它将您的插件存储到一个指针中。

此插件架构基于消息传递:宿主将您的消息的计数引用发送给每个插件。

为什么有 tokio-host 功能?

tokio-host 功能允许您选择一个依赖于 tokio 的运行时和通道的宿主,而不是 std 的线程和通道。选择最适合您应用程序的选项,但请记住,tokio-host 的 API 中的某些部分是异步函数而不是普通函数,您需要使用 .await 才能使其生效。

这个库的内存安全性如何?

非常安全:消息传递队列通常是您通过方法调用来做的,确保您的插件只按顺序被宿主调用:您可以自由地修改状态,只要您在插件中不要有并发。

同时,消息通过不可变的计数引用传递:除非您打破常规规则,否则即使有多个插件同时运行,您也无法破坏自己的消息。

等等,消息是不可变引用,而 handle_message 只返回 Option<u8>... 我如何将数据发送回我的宿主应用程序?

为此,您需要为您的插件提供一个它们可以使用来发送数据的通道。您可以选择任何通道,但我建议使用 std::sync::mpsc::sync_channel

这个库与其它编程语言兼容吗?

老实说,并非如此:当前用于动态加载插件的接口是一个 Box<dyn Plugin<T>>,您需要在自己的替代语言中模拟此接口,才能开始在其他语言中制作插件...

如果您想与其他语言兼容,可能需要构建一个插件,将插件系统与您可能在该语言中开发的插件进行接口。老实说,此时,您可能还不如直接开发自己的插件接口...

依赖项

~0.1–1.4MB
~21K SLoC