1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use std::sync::mpsc::*; use std::sync::Mutex; use std::thread; use std::thread::JoinHandle; use crate::controller::channel_convert; use crate::db::*; use crate::task::*; lazy_static! { pub static ref CHANNEL_CONVERT : Channel<(TaskForConvert,RawTask)> = Channel::new(); } pub fn start_receive_threads() -> Vec<JoinHandle<()>> { let mut threads: Vec<JoinHandle<()>> = Vec::new(); threads.push(start_thread(&CHANNEL_CONVERT.receiver, channel_convert)); info!("--------------------nature threads initialized---------------------"); threads } fn start_thread<T, F>(receiver: &'static Mutex<Receiver<T>>, f: F) -> JoinHandle<()> where T: Send, F: 'static + Fn(T) + Send { use std::ops::Deref; thread::spawn(move || { let guard = receiver.lock().unwrap(); let receiver = guard.deref(); for next in receiver { f(next); } }) } pub struct Channel<T> { pub sender: Mutex<Sender<T>>, pub receiver: Mutex<Receiver<T>>, } impl<T> Channel<T> { pub fn new() -> Channel<T> { let (sx, rx) = channel(); Channel { sender: Mutex::new(sx), receiver: Mutex::new(rx), } } } impl<T> Default for Channel<T> { fn default() -> Self { Self::new() } }