1 个不稳定版本
0.3.0 | 2024 年 4 月 14 日 |
---|---|
0.1.0 |
|
#4 in #latin
每月 48 次下载
24KB
279 代码行
Opifex
Opifex 是拉丁语中的一个单词,意思是 工匠 或 制造商,指的是 工作者,他创造了某物。这个 crate 定义了一个 Worker<Mode>
结构体,类似于 web worker 接口,它代表一个可以与其创建者通信的任务,并且能够接收来自它的消息。
快速入门
Opifex
的使用非常简单直观。
假设我们需要实现一个简单的任务:将两个整数相加,比如说 a
和 b
。我们可以创建一个简单的结构体
#[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