Multithreading 锈蚀中的多螺纹记忆
我正在Rust中开发一个算法,我想实现多线程。该算法的本质是它产生了重叠子问题的解决方案,因此我正在寻找一种实现多线程记忆的方法 Pritchard在中介绍了(单线程)回忆录的实现 我希望扩展此功能,以便:Multithreading 锈蚀中的多螺纹记忆,multithreading,asynchronous,rust,Multithreading,Asynchronous,Rust,我正在Rust中开发一个算法,我想实现多线程。该算法的本质是它产生了重叠子问题的解决方案,因此我正在寻找一种实现多线程记忆的方法 Pritchard在中介绍了(单线程)回忆录的实现 我希望扩展此功能,以便: 无论何时必须调用基础函数(包括递归调用),都会在新线程上异步计算结果 从上一点继续,假设我们有一些记忆函数f,和f(x),需要递归调用f(x1),f(x2),…f(xn)。所有这些递归调用都应该可以在单独的线程上并发计算 如果对当前正在计算结果的输入调用了memoised函数,则当前线程应在
f
,和f(x)
,需要递归调用f(x1)
,f(x2)
,…f(xn)
。所有这些递归调用都应该可以在单独的线程上并发计算f(x)
(如果还没有),而不阻塞当前线程。这允许程序员先发制人地开始对一个他们知道以后需要(或可能需要)的特定值的结果进行评估一种方法是存储一个
HashMap
,其中键是f
的参数,值是包含结果的一次性消息的接收者。然后,对于您需要的任何值:
- 如果地图上已经有接收器,等待它
- 否则,生成一个future来开始计算结果,并将接收器存储在地图中
使用未来:{
未来:{self,BoxFuture},
序曲::*,
准备好的
};
使用std::{
集合::HashMap,
pin::pin,
sync::Arc,
任务::{Context,Poll},
};
使用tokio::sync::{oneshot,Mutex};
#[派生(克隆、调试、Eq、哈希、PartialEq)]
结构输入(usize);
#[派生(克隆、调试、Eq、哈希、PartialEq)]
结构内存返回(usize);
///这是为“HashMap”创建具体类型所必需的。
结构OneShotReceiveUnwrap(oneshot::Receiver);
OneshotReceiverUnwrap的impl未来{
类型输出=T;
fn民意测验(mut self:Pin、cx:&mut Context boxfuture请提供一个示例。您尝试了什么,出了什么问题?听起来很复杂,因为数据共享的开销,您可能会完全放弃并行性的好处。为什么您认为这应该是并行的?生成一个新线程并立即阻止它有什么意义?并行性的要点是在等待另一个线程的工作结果时继续处理其他线程。当这个递归函数在等待计算n-1
th值时,它能做多少工作?@Coder-256在我的问题中我可能没有足够清楚地说明这一点,但是这个递归函数有很多广度递归调用以及深度。我不知道Rust中的等价物是什么,但想象一下在JavaScript中,f(x)
调用Promise.all([f(x1),f(x2),…f(xn)])
。