🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] lib.rs ```rust use std::sync::mpsc; use std::sync::Arc; use std::sync::Mutex; use std::thread; pub struct ThreadPool { workers: Vec<Worker>, sender: mpsc::Sender<Message>, } type Job = Box<dyn FnOnce() + Send + 'static>; enum Message { NewJob(Job), Terminate, } impl ThreadPool { /// Create a new ThreadPool. /// /// The size is the number of threads in the pool. /// /// # Panics /// /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); let (sender, receiver) = mpsc::channel(); let receiver = Arc::new(Mutex::new(receiver)); let mut workers = Vec::with_capacity(size); for id in 0..size { workers.push(Worker::new(id, Arc::clone(&receiver))); } ThreadPool { workers, sender } } pub fn execute<F>(&self, f: F) where F: FnOnce() + Send + 'static, { let job = Box::new(f); self.sender.send(Message::NewJob(job)).unwrap(); } } impl Drop for ThreadPool { fn drop(&mut self) { println!("Sending terminate message to all workers."); for _ in &self.workers { self.sender.send(Message::Terminate).unwrap(); } println!("Shutting down all workers."); for worker in &mut self.workers { println!("Shutting down worker {}", worker.id); if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } } } } struct Worker { id: usize, thread: Option<thread::JoinHandle<()>>, } impl Worker { fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Message>>>) -> Worker { let thread = thread::spawn(move || loop { let message = receiver.lock().unwrap().recv().unwrap(); match message { Message::NewJob(job) => { println!("Worker {} got a job; executing.", id); job(); } Message::Terminate => { println!("Worker {} was told to terminate.", id); break; } } }); Worker { id, thread: Some(thread), } } } ``` main.rs ```rust use std::net::{TcpListener, TcpStream}; use std::io::prelude::*; use std::fs; use std::thread; use std::time::Duration; use untitled1::ThreadPool; fn main() { let listener = TcpListener::bind("127.0.0.1:80").unwrap(); println!("服务器启动成功! http://127.0.0.1:80"); let pool = ThreadPool::new(4); // Task 最多迭代两次,以便于测试销毁 for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!("Shutting down."); } fn handle_connection(mut stream: TcpStream) { let mut buffer = [0; 1024]; stream.read(&mut buffer).unwrap(); let get = b"GET / HTTP/1.1\r\n"; let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { ("HTTP/1.1 200 OK\r\n", "hello.html") } else if buffer.starts_with(sleep) { //服务器接收到请求休眠5秒钟 thread::sleep(Duration::from_secs(5)); ("HTTP/1.1 200 OK\r\n", "hello.html") } else { ("HTTP/1.1 404 NOT FOUND\r\n", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); let response = format!("{}Content-Length: {}\r\n\r\n{}", status_line, contents.len(), contents); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); } ``` ![](https://img.kancloud.cn/58/bf/58bf4839ff0f63ccc2ba02537ed53e25_579x357.png)