Rust从入门到实战系列二百四十六:将单线程 server 变为多线程 server

文章描述了一个基于Rust的简单web服务器,它通过模拟慢请求来演示串行处理的问题。作者提出使用线程池来优化并发,使得后续请求不会因某个慢请求而阻塞。
摘要由CSDN通过智能技术生成

ch20-02-multithreaded.md
commit 95b5e7c86d33e98eec6f73b268d106621f3d24a1
目前 server 会依次处理每一个请求,意味着它在完成第一个连接的处理之前不会处理第二个连接。如果
server 正接收越来越多的请求,这类串行操作会使性能越来越差。如果一个请求花费很长时间来处理,
随后而来的请求则不得不等待这个长请求结束,即便这些新请求可以很快就处理完。我们需要修复这种
情况,不过首先让我们实际尝试一下这个问题。
在当前 server 实现中模拟慢请求
让我们看看一个慢请求如何影响当前 server 实现中的其他请求。示例 20-10 通过模拟慢响应实现了
∕sleep 请求处理,它会使 server 在响应之前休眠五秒。
文件名: src∕main.rs

use std::fs;

use std::io::prelude:😗;

use std::net::TcpListener;

use std::net::TcpStream;

use std::thread;
use std::time::Duration;
// --snip–

fn main() {

let listener = TcpListener::bind(“127.0.0.1:7878”).unwrap();

for stream in listener.incoming() {

let stream = stream.unwrap();

handle_connection(stream);

}

}

fn handle_connection(mut stream: TcpStream) {
// --snip–

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”, “hello.html”)
} else if buffer.starts_with(sleep) {
thread::sleep(Duration::from_secs(5));
(“HTTP/1.1 200 OK”, “hello.html”)
} else {
(“HTTP/1.1 404 NOT FOUND”, “404.html”)
};
// --snip–

let contents = fs::read_to_string(filename).unwrap();

536 CHAPTER 20. 最后的项目: 构建多线程 WEB SERVER

let response = format!(

“{}\r\nContent-Length: {}\r\n\r\n{}”,

status_line,

contents.len(),

contents

);

stream.write(response.as_bytes()).unwrap();

stream.flush().unwrap();

}
示例 20-10: 通过识别 ∕sleep 并休眠五秒来模拟慢请求
这段代码有些凌乱,不过对于模拟的目的来说已经足够。这里创建了第二个请求 sleep,我们会识别其
数据。在 if 块之后增加了一个 else if 来检查 ∕sleep 请求,当接收到这个请求时,在渲染成功 HTML 页
面之前会先休眠五秒。
现在就可以真切的看出我们的 server 有多么的原始:真实的库将会以更简洁的方式处理多请求识别问
题!
使用 cargo run 启动 server,并接着打开两个浏览器窗口:一个请求 http:∕∕127.0.0.1:7878∕ 而另一个
请求 http:∕∕127.0.0.1:7878∕sleep 。如果像之前一样多次请求 ∕,会发现响应的比较快速。不过如果请求
∕sleep 之后在请求 ∕,就会看到 ∕ 会等待直到 sleep 休眠完五秒之后才出现。
这里有多种办法来改变我们的 web server 使其避免所有请求都排在慢请求之后;我们将要实现的一个
便是线程池。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值