我在想我的想法是否可以实现:一个完全支持异步 Rust 的动态库插件管理器。
实现分为三个主要部分(github repo):
my-interface,一个async_trait(具有“正常”特征的方法似乎工作正常,不知道到什么程度)
use async_trait::async_trait;
#[async_trait]
pub trait SayHelloService {
async fn say_hello(&self);
}
Run Code Online (Sandbox Code Playgroud)
my-master,加载.dll/.so并从库中调用一个创建函数,给定 a tokio::runtime::Handle,返回一个Box<dyn SayHelloService>
use my_interface::SayHelloService;
use tokio::{self, runtime::Handle};
#[tokio::main]
async fn main() {
let lib = libloading::Library::new("target/debug/libmy_plugin.so").expect("load library");
let new_service: libloading::Symbol<fn(Handle) -> Box<dyn SayHelloService>> =
unsafe { lib.get(b"new_service") }.expect("load symbol");
let service1 = new_service(Handle::current());
let service2 = new_service(Handle::current());
let _ = tokio::join!(service1.say_hello(), service2.say_hello());
}
Run Code Online (Sandbox Code Playgroud)
my-plugin,实现SayHelloService,这是阻止我的代码
use …Run Code Online (Sandbox Code Playgroud)