728x90
1회독 끝!
싱글 스레드 서버를 멀티스레드 서버로 바꾸기
use hello::ThreadPool;
use std::{
fs,
io::{prelude::*, BufReader},
net::{TcpListener, TcpStream},
thread,
time::Duration,
};
fn main() {
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
let pool = ThreadPool::new(4);
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 buf_reader = BufReader::new(&mut stream);
let request_line = buf_reader.lines().next().unwrap().unwrap();
let (status_line, filename) = match &request_line[..] {
"GET / HTTP/1.1" => ("HTTP/1.1 200 OK", "hello.html"),
"GET /sleep HTTP/1.1" => {
thread::sleep(Duration::from_secs(5));
("HTTP/1.1 200 OK", "hello.html")
}
_ => ("HTTP/1.1 404 NOT FOUND", "404.html"),
};
let contents = fs::read_to_string(filename).unwrap();
let length = contents.len();
let response = format!(
"{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"
);
stream.write_all(response.as_bytes()).unwrap();
}
웹서버의 처리량을 개선하는 여러가지 방법
- 스레드풀
- 포크 조인 모델
- 싱글스레드 비동기 I/O 모델
- 멀티스레드 비동기 I/O 모델
스레드 풀(thread pool)
- 작업 처리가 준비된 대기 중인 스레드 그룹
- 프로그램이 새 작업을 받으면 해당 작업을 풀에 있는 스레드 중 하나에게 할당하고 해당 스레드가 작업을 처리함.
- 스레드 개수를 제한하면 서비스 거부 공격(DoS) 으로 부터 보호 할수 있음.
워커(Worker)
- 스레드 풀과 스레드 사이에 새로운 동작을 관리하는 데이터 구조
마지막은 뭔가 복사 붙여넣기 하면서 읽느라 어영부영 이해하고 끝나긴했다.
그래도 남은 4월동안 러스트 책 다시 읽어볼 예정이니깐 괜찮다.
'STUDY > Rust' 카테고리의 다른 글
Rust - 26. 최종 프로젝트 (1) (1) | 2024.04.01 |
---|---|
Rust - 25. 고급 기능 (3) 고급 함수와 클로저, 매크로 (0) | 2024.03.31 |
Rust - 24. 고급 기능 (2) 고급 트레이트, 고급 타입 (0) | 2024.03.31 |
Rust - 23. 고급 기능 (1) Unsafe RUST (1) | 2024.03.31 |
Rust - 22. 패턴과 매칭 (0) | 2024.03.26 |