#worker #web-worker #task #message #who #latin #word

opifex

Opifex 是拉丁语中的一个单词,意思是工匠或制造商,指的是创造了某物的工作者

1 个不稳定版本

0.3.0 2024 年 4 月 14 日
0.1.0 2024 年 4 月 4 日

#4 in #latin

每月 48 次下载

自定义许可证

24KB
279 代码行

Opifex

Crates.io

Opifex 是拉丁语中的一个单词,意思是 工匠制造商,指的是 工作者,他创造了某物。这个 crate 定义了一个 Worker<Mode> 结构体,类似于 web worker 接口,它代表一个可以与其创建者通信的任务,并且能够接收来自它的消息。

快速入门

Opifex 的使用非常简单直观。

假设我们需要实现一个简单的任务:将两个整数相加,比如说 ab。我们可以创建一个简单的结构体

#[derive(Clone, Debug)]
pub struct Sum {
    a: i32,
     b: i32,
}

这个结构体将是我们将发送给以下加法任务的消息

pub struct Adder {}

impl Task for Adder {
    type Handle = handle::Worker<handle::TwoWay<Sum, Result>>;
    type Output = usize;
    
    fn spawn(
        &self,
        wk_hnd: Self::Handle,
    ) -> impl std::future::Future<Output = Self::Output> + Send + 'static {
        let (mut rx, hnd) = wk_hnd.receiver();
        
        async move {
            let mut count: usize = 0;
            
            loop {
                tokio::select! {
                    Some(sum) = rx.recv() => {
                        count += 1;
                        if let Err(e) = hnd.post_message(Result::from(sum)).await {
                            println!("Oops! Sending message reports: {e}");
                        }
                    }
                    () = hnd.terminated() => {
                        println!("Worker is terminated. Bye from adder task!");
                        break;
                    }
                }
            }
            
            count
        }
    }
}

有了这样一个任务,并且想要接收其结果,我们可以简单地使用以下命令创建一个工作进程

let adder_worker = Worker::<TwoWay<Sum, Result>>::spawn(Adder {});

同样,我们可以实现一个响应任务并将其添加为 Adder 任务生成事件的订阅者。为此,我们使用 on_message 函数

let response_worker = adder_worker.on_message(Response {});

现在我们可以发送 Sum 消息到 Adder 任务

if let Err(e) = adder_worker.post_message(Sum { a: 24, b: 28 }).await {
    eprintln!("Oops! sending a message to adder reports: {e}");
}

完整的示例可以在 examples 文件夹中找到。

依赖项

~2.8–9.5MB
~65K SLoC