2016-03-01 5 views
5

ho qualche codice che utilizza scoped_threadpool un po 'come questo:Come posso restituire un errore da un thread 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")) 
} 

La funzione fallible_code recentemente cambiato per restituire un Result, e mi piacerebbe per propagare l'errore di fuori del blocco pool.scoped. Tuttavia, la firma di Scope::execute non consente per un valore di ritorno:

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

Sto usando scoped_threadpool 0.1.7.

risposta

2

Non so se si tratta di un metodo particolarmente idiomatico, ma un metodo che almeno funziona è l'assegnazione a una variabile acquisita.

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>) 

Ovviamente avresti bisogno di fare un retOption o giù di lì, se non v'è alcun valore predefinito banale. Se la chiusura interna deve essere move, è necessario rendere esplicito ret_ref = &mut ret.

+0

L'idea sembra buona, ma non si dovrebbe 'ret' essere' Sync'? –

+0

@MatthieuM. È, ed è per questo che 'ret.map_err (| x | x as Box )' è necessario per abbinare il tipo di ritorno di inner_main'. – Veedrac