The Rust Programming Language - 第20章 最后的项目:构建多线程web server - 20.3 优雅的停机与清理

20 最后的项目:构建多线程web server

本章我们将会练习一个项目,顺便复习一下前面几章的内容,这个项目会实现宇哥返回”Hello“的web server

如下是我们的计划:

1.学习一些TCP与HTTP知识

2.在套接字(socket)上监听TCP请求

3.解析少量的HTTP请求

4.创建一个合适的HTTP响应

5.通过线程池改善server的吞吐量

但是注意,我们本次实例并不是使用Rust构建web server最好的方法。crates.io上有很多可用于生产环境的crate。它们提供了比我们所要编写的更为完整的web server 和线程池的实现

所以本章的目的在于学习而不是实现,走捷径。因为Rust是一个系统编程语言,我们能够选择处理什么层次的抽象,,并能够选择比其它语言可能或可用的层次更低的层次,因此我们将自己编写一个基础的HTTP server和线程池,以便学习将来可能用到的crate背后的通用理念和技术

20.3 优雅的停机与清理

warning: field is never read: `workers`     
 --> src\lib.rs:8:6
  |
8 |      workers:Vec,
  |      ^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: field is never read: `id`
  --> src\lib.rs:50:6
   |
50 |      id:usize,
   |      ^^^^^^^^

warning: field is never read: `thread`
  --> src\lib.rs:51:6
   |
51 |      thread:thread::JoinHandle<()>,
   |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

warning: `hello` (lib) generated 3 warnings
    Finished dev [unoptimized + debuginfo] target(s) in 2.01s
     Running `target\debug\main.exe`
Worker 0 got a job; executing.

上面的代码如我们的期望能够正常运行,也就是使用线程池异步的响应请求。但是我们看到一些警告,说workers、id、thread字段没有被直接使用,这提醒了我们并没有清理所有的内容。当我们使用ctrl + c 终止主线程时,其它线程也会立即停止,即使它们是出于请求中

现在我们为ThreadPool实现Drop trait,并且对每一个线程调用join,让它们执行完它们的请求。接着我们再为ThreadPool实现一个方式告诉这些线程停止接受请求并结束。为了达到这个目的,我们修改server在优雅停机之前只接受两个请求

为ThreadPool 实现Drop trait

我们为线程池实现了Drop trait, 当线程池被丢弃时,应该join所有线程以确保它们完成其操作,我们编译并运行有如下代码

impl Drop for ThreadPool {
     fn drop(&mut self) {
          for worker in &mut self.workers {
               println!("Shutting down worker {}",worker

你可能感兴趣的:(#,Rust,rust,前端,开发语言,web)