2025년 4월 18일 금요일

5-3-1강: 파일 입출력(동기식, 비동기식)

 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;
            },
        };
    }
}

댓글 없음:

댓글 쓰기