Tokio runtime worker线程在哈希函数中出现栈溢出问题求助
Tokio runtime worker线程在哈希函数中出现栈溢出问题求助
大家好!我正在写一个用来排查重复文件的小应用,主要也是为了练习Rust(我刚接触这门语言没多久😅)。
因为我之前做过媒体管理相关的工作,经常要处理超大文件,再加上想多学点并发相关的知识,所以我下定决心要让这个程序能高效利用我机器的多核性能。目前我选用了Tokio运行时库和deadqueue作为队列实现。
现在我的worker线程代码大致是这样的(worker_count初始设置为num_cores返回的核心数,之后会改成可通过命令行参数自定义):
println!("Starting up {} worker threads...", worker_count); for n in 0..worker_count { let rxq = queue.clone(); tokio::spawn(async move { eprintln!("INFO Thread {}", n); let _ = io::stderr().flush(); loop { let ff = rxq.pop().await; eprintln!("Popped {}", ff.full_path.display()); // 调用哈希计算函数时触发了栈溢出 let hash = compute_hash(&ff.full_path).await?; // ...后续的哈希比对和重复文件标记逻辑 } }); }
现在遇到的问题是,当compute_hash处理大文件的时候,worker线程会直接触发栈溢出错误。我猜测可能是哈希计算过程中把过多数据加载到栈上了,但不确定具体该怎么调整。有没有大佬能给我一些建议?比如是不是应该把哈希计算的内存分配转移到堆上,或者需要调整Tokio worker线程的栈大小?
备注:内容来源于stack exchange,提问作者fredex42
相关产品推荐
相关产品推荐

