小编Fra*_*zzi的帖子

Rust 中的库插件管理器现在可行吗?

我在想我的想法是否可以实现:一个完全支持异步 Rust 的动态库插件管理器。

实现分为三个主要部分(github repo):

  1. 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)
  2. 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)
  3. my-plugin,实现SayHelloService,这是阻止我的代码

    use …
    Run Code Online (Sandbox Code Playgroud)

ffi rust async-await

4
推荐指数
1
解决办法
199
查看次数

标签 统计

async-await ×1

ffi ×1

rust ×1