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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use std::sync::{Arc, mpsc, Mutex};
use std::thread;
use std::thread::JoinHandle;
use json::{JsonValue};


type Job = Box<dyn FnOnce(usize) -> JsonValue + 'static + Send>;

enum Message {
    End,
    NewJob(Job),
}


struct Worker {
    _id: usize,
    t: Option<JoinHandle<Vec<JsonValue>>>,
}

impl Worker {
    fn new(id: usize, receiver: Arc::<Mutex<mpsc::Receiver<Message>>>) -> Worker {
        let t = thread::spawn(move || {
            // let mut index = 0;
            let mut list = vec![];
            loop {
                let message = receiver.lock().unwrap().recv().unwrap();
                match message {
                    Message::NewJob(job) => {
                        list.push(job(id));
                        // index += 1;
                    }
                    Message::End => {
                        // info!("结束 线程[{}] {}", id, index);
                        break;
                    }
                }
            }
            list
        });
        Worker {
            _id: id,
            t: Some(t),
        }
    }
}

pub struct Pool {
    workers: Vec<Worker>,
    max_workers: usize,
    sender: mpsc::Sender<Message>,
}

impl Pool {
    pub fn new(max_workers: usize) -> Pool {
        if max_workers <= 0 {
            panic!("max_workers 必须大于0")
        }
        let (tx, rx) = mpsc::channel();
        let mut workers = Vec::with_capacity(max_workers);
        let receiver = Arc::new(Mutex::new(rx));
        for i in 0..max_workers {
            workers.push(Worker::new(i, Arc::clone(&receiver)));
        }
        Pool { workers, max_workers, sender: tx }
    }
    pub fn execute<F>(&self, f: F) where F: 'static + Send + FnOnce(usize) -> JsonValue {
        let job = Message::NewJob(Box::new(f));
        self.sender.send(job).unwrap();
    }
    pub fn end(&mut self) -> JsonValue {
        for _ in 0..self.max_workers {
            self.sender.send(Message::End).unwrap();
        }
        let mut list = vec![];
        for w in self.workers.iter_mut() {
            if let Some(t) = w.t.take() {
                let data = t.join().unwrap();
                list.extend(data);
            }
        }
        return JsonValue::from(list);
    }
    pub fn insert_all(&mut self) -> (Vec<String>, String) {
        for _ in 0..self.max_workers {
            self.sender.send(Message::End).unwrap();
        }
        let mut list = String::new();
        let mut id = vec![];
        for w in self.workers.iter_mut() {
            if let Some(t) = w.t.take() {
                let data = t.join().unwrap();
                for item in data.iter() {
                    id.push(item[0].to_string());
                    list = format!("{},{}", list, item[1].clone());
                }
            }
        }
        return (id, list);
    }
}