비동기 프로그래밍

  • 독립적으로 발생하는 이벤트에 대한 처리를 위한 동시성 프로그래밍 기법의 총칭.

동시 서버

  • 간단한 TCP 서버를 보자.
use std::io::{BufRead, BufReader, BufWriter, Write};
use std::net::TcpListener;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:10000").unwrap();
    while let Ok((stream, _)) = listener.accept() {
        let stream0 = stream.try_clone().unwrap();
        let mut reader = BufReader::new(stream0); // 읽기 객체
        let mut writer = BufWriter::new(stream); // 쓰기 객체

        let mut buf = String::new();
        reader.read_line(&mut buf).unwrap(); // 한 줄씩 읽는다.
        writer.write(buf.as_bytes()).unwrap(); // 읽은 내용을 그대로 쓴다.
        writer.flush().unwrap();
    }
}
  • 이 서버는 한 번에 한 유저의 요청만 처리할 수 있다. 유저A의 요청에 응답하기 전까지는 유저B의 요청을 처리할 수 없다.
  • 동시 서버는 클라이언트의 요청에 대한 처리를 이벤트 단위로 분류해 이벤트에 따라 처리를 수행할 수 있다.
  • IO 이벤트 감시는 파일 디스크립터를 감시하는 것이다:
    • 여러 TCP 커넥션이 있다면, 서버는 여러 파일 디스크립터를 가진다.
    • 각 파일 디스크립터에 대한 읽기/쓰기 가능 여부를 select, kqueue, epoll과 같은 함수로 판단한다.

코루틴

  • 코루틴은 다양한 의미로 사용되지만, 보통은 중단과 재개가 가능한 함수를 총칭한다.
  • 코루틴 문서를 참고.

이 문서를 인용한 문서