multithreading - 在 Rust 中使用 `Result<T, Box<dyn Error>>` 技巧,但跨多个线程

标签 multithreading rust rayon

用返回 Result<X, Box<dyn Error>> 来注释你的函数是一个常见的技巧。允许他们返回任何错误。但是,如果没有实现 Send 的错误本身,您就无法从线程返回它。 .例如这段代码:

use rayon::prelude::*; // 1.5.1
use std::error::Error;

fn main(){
    ["1", "2", "three"]
        .into_par_iter()
        .try_for_each(|i| -> Result<usize, Box<dyn Error>> {
            let inner = i.parse::<usize>()?;
            Ok(inner)
        }
    );
}
给出这个错误:
error[E0277]: `dyn std::error::Error` cannot be sent between threads safely
( playground )

另一方面,如果您尝试指定错误必须实现 Send , ?运算符不再起作用:
use rayon::prelude::*; // 1.5.1
use std::error::Error;

fn main(){
    ["1", "2", "three"]
        .into_par_iter()
        .try_for_each(|i| -> Result<usize, Box<dyn Error + Send>> {
            let inner = i.parse::<usize>()?;
            Ok(inner)
        }
    );
}
error[E0277]: `?` couldn't convert the error to `Box<dyn std::error::Error + Send>`
( playground )
我怎样才能继续使用 Box<dyn Error>快捷方式,但仅限于可以发送的错误,允许它跨线程工作?

最佳答案

std中的实现您要找的是this :

impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
将闭包的返回类型更改为 Result<usize, Box<dyn Error + Send + Sync>> ,修复不相关的类型错误,它会编译。

关于multithreading - 在 Rust 中使用 `Result<T, Box<dyn Error>>` 技巧,但跨多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68882594/

相关文章:

linux - 多线程环境下可重入函数有什么用?

multithreading - 通过线程使用向量单元

iphone - Objective-C : Start an object on a background thread -- interact as usual?

rust - 拆分 `Vec`

parallel-processing - 程序仍然使用 par_iter 和 par_extend 在一个线程上运行

rust - 找不到 `rayon` 的箱子

java - 线程中断有时有效有时无效

rust - 如何从切片中复制最后一个元素

rust - 为什么复制 C 对无符号整数的 fread 的通用函数总是返回零?

file-io - rayon::str::Lines <'_' > 不是迭代器