1. 동기식 파일 입출력 이란?
동기식 입출력 방식은 작업이 완료될 때 까지 무한정 기다린다.
입출력이 완료될 때까지 기다리니 CPU 자원을 비효율적으로 사용한다.
// 동기식 입출력 방식의 예제
use std::fs::File;
use std::io::{Read, Write};
fn main() {
let mut file = File::open("input.txt").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
// 파일을 읽을때 까지 대기합니다.
println!("{}", contents);
let mut file = File::create("output.txt").unwrap();
file.write_all(contents.as_bytes()).unwrap();
// 파일을 쓸때 까지 대기합니다.
}
2. 비동기식 파일 입출력이란?
비동기식 입출력 방식은 메인 스레드를 멈추지 않기에
CPU 자원을 효율적으로 사용한다.
/*cargo.toml에 의존성 추가
[dependencies]
tokio = { version = "1.25.0", features = ["full"] } */
use tokio::fs::File;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() {
// 비동기 방식으로 file 핸들러를 얻는다.
//input.txt 엔 hello world 가 입력되어 있다.
let mut file = File::open("input.txt").await.unwrap();
let mut contents = String::new();
// 비동기 방식으로 file 읽기
file.read_to_string(&mut contents).await.unwrap();
// input.txt의 내용을 출력
println!("{}", contents);
//비동기 방식으로 file 생성
let mut file = File::create("output.txt").await.unwrap();
//비동기 방식으로 file 저장 (input.txt에 있는 hello world가 output.txt에 저장된다.)
file.write_all(contents.as_bytes()).await.unwrap();
}
// 비동기 방식으로 구현한 이벤트 루프 예제
/* 의존성 추가
[dependencies]
tokio = { version = "1.25.0", features = ["full"] }
*/
use tokio::io::{stdin, BufReader, AsyncBufReadExt};
use tokio::fs::File;
#[tokio::main]
async fn main() {
let mut reader = BufReader::new(stdin());
let mut lines = reader.lines();
loop { // quit가 입력될때 까지 입력을 받음
match lines.next_line().await.unwrap() {
Some(input) => {
println!("입력: {}", input);
if input == "quit" {
break;
}
}
None => {
break;
},
};
}
}
댓글 없음:
댓글 쓰기