如何从scoped_threadpool线程返回错误?

时间:2016-03-01 00:00:55

标签: error-handling rust

我有一些使用scoped_threadpool的代码有点像这样:

extern crate scoped_threadpool;

use scoped_threadpool::Pool;
use std::error::Error;

fn main() {
    inner_main().unwrap();
}

fn inner_main() -> Result<(), Box<Error>> {
    let mut pool = Pool::new(2);

    pool.scoped(|scope| {
        scope.execute(move || {
            // This changed to become fallible
            fallible_code();
        });
    });

    Ok(())
}

fn fallible_code() -> Result<(), Box<Error + Send + Sync>> {
    Err(From::from("Failing"))
}

fallible_code函数最近更改为返回Result,我希望将错误传播到pool.scoped块之外。但是,Scope::execute的签名不允许返回值:

fn execute<F>(&self, f: F) 
    where F: FnOnce() + Send + 'scope

我正在使用scoped_threadpool 0.1.7。

1 个答案:

答案 0 :(得分:2)

我不知道它是否是一种特别惯用的方法,但至少有一种方法可以分配给捕获的变量。

let mut pool = Pool::new(2);
let mut ret = Ok(());

pool.scoped(|scope| {
    scope.execute(|| {
        ret = fallible_code();
    });
});

ret.map_err(|x| x as Box<Error>)

显然,如果没有简单的默认值,您需要将ret设为Option左右。如果内部闭包必须是move,则需要明确ret_ref = &mut ret