WalkParallel实现的功能是对目标文件并行遍历,采用的是生产者-消费者模型。
类说明
WalkState
WalkState用于控制目录遍历的行为,特别适用于并行文件系统遍历的场景。
pub enum WalkState {
Continue,
Skip,
Quit,
}
Continue- 默认状态,继续正常遍历
- 如果是目录,会递归进入该目录
Skip- 仅当当前条目是目录时有效
- 跳过该目录,不进入遍历
- 对文件条目无影响
Quit- 请求终止整个遍历过程
- 由于并行遍历的特性,可能还会有一些条目被处理
- 通常用于找到目标后提前退出
Visitor相关
和Visitor相关的类用于定义对文件系统条目的具体处理行为。逐步拆解每个相关类。
ParallelVistor Trait
pub trait ParallelVisitor: Send {
fn visit(&mut self, entry: Result<DirEntry, Error>) -> WalkState
}
- 这是一个访问者接口,定义了如何处理每个文件/目录条目
visit方法接收一个DirEntry或错误,返回WalkState来控制遍历行为
ParallelVisitorBuilder<’s>
pub trait ParallelVistorBuilder<'s> {
fn build(&mut self) -> Box<dyn ParallelVisitor + 's>;
}
impl<'a, 's, P: ParallelVisitorBuilder<'s>> ParallelVisitorBuilder<'s>
for &'a mut P
{
fn build(&mut self) ->Box<dyn ParallelVisitor + 's> {
(**self).build()
}
}
ParallelVisitorBuilder定义了如何构造visitor,这里主要是涉及到了常见的Rust模式,称为reference implementation.这样就可以不转移Builder的所有权了,在需要多次调用build()时,可以避免所有权问题。
FnVisitor
type FnVisitor<'s> =
Box<dyn FnMut(Result<DirEntry, Error>) -> WalkState + Send + 's>;
- 这是一个可调用对象类型别名,用于简化闭包的存储
Send和's都是修饰闭包的,Send保证可以安全的在线程间传递,'s确保闭包不会比它捕获的引用活的更久
FnVisitorImp
struct FnVisitImp<'s> {
visitor: FnVisitor<'s>,
}
impl<'s> ParallelVisitor for FnVisitImp<'s> {
fn visit(&mut self, entry: Result<DirEntry, Error>) -> WalkState {
(self.visitor)(entry)
}
}
- 包装了
FnVisitor,实现了ParallelVisitortrait - 将
visit调用委托给内部的闭包