Sam*_*ick 1 parallel-processing rust
我正在尝试编写一个函数parallelize,该函数将函数作为参数B并返回一个函数C,其中C返回一个正在运行的线程的句柄B.我明白这可能是笨重或荒谬的; 它主要是作为一个学习项目.更高级别的目标是在迭代器上实现并行映射函数,其中列表的每个元素将映射到不同的线程(或最终可能通过线程池).我很快就意识到我已经超越了我的头脑.鉴于我所描述的,这种类型应该parallelize是什么?
让我们一步一步地介绍它:
一个功能
parallelize
fn parallelize() {
unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)
是的,这是一个功能正常.
参数一个函数B.
我假设您希望函数能够返回一些东西,所以我将使用泛型类型R.
fn parallelize<B, R>(function: B)
where
B: FnOnce() -> R,
{
unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)
返回一个函数C.
哦,哦.你还不能在Rust中干净利落地做到这一点.这意味着我们会返回一个盒装特质的对象,而不是
fn parallelize<B, R>(function: B) -> Box<FnOnce()>
where
B: FnOnce() -> R,
{
unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)
其中C返回运行B的线程的句柄
use std::thread::JoinHandle;
fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
B: FnOnce() -> R,
{
unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)
这是你的签名.都在这里完成!
.....
当然,还有更多工作要做.例如,您没有说明线程何时应该实际启动.这意味着我可以选择,我选择最简单的方法 - 当调用者请求句柄时启动线程.
use std::thread::{self, JoinHandle};
fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
B: Send + FnOnce() -> R + 'static,
R: Send + 'static,
{
Box::new(|| thread::spawn(function))
}
Run Code Online (Sandbox Code Playgroud)
我猜你也可以马上开始吧:
use std::thread::{self, JoinHandle};
fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
B: Send + FnOnce() -> R + 'static,
R: Send + 'static,
{
let handle = thread::spawn(function);
Box::new(|| handle)
}
Run Code Online (Sandbox Code Playgroud)
我不知道你为什么要做第二个; 在这种情况下,你也可以直接返回句柄.如果你做的是,你可能也只是调用thread::spawn直接.
哦,我想我无法将那些额外的特质限制在你身边,是吗?在调用时thread::spawn,您必须确保在线程退出(因此'static)之前,您传递的任何内容都不会有效,并且可以安全地在线程之间进行传输(因此Send).
更高级别的目标是在迭代器上实现并行映射函数
这存在并被称为人造丝.
也可以看看:
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |