νƒœμŠ€ν¬

Rust의 νƒœμŠ€ν¬(μž‘μ—…) μ‹œμŠ€ν…œμ€ κ²½λŸ‰ μŠ€λ ˆλ”©μ˜ ν•œ μ’…λ₯˜λ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ μž‘μ—…μ—λŠ”, μ‹€ν–‰μžκ°€ 이 μž‘μ—…μ„ μ§„ν–‰ν•˜κΈ° μœ„ν•΄ 계속 ν΄λ§ν•˜λŠ”, μ΅œμƒμœ„ futureκ°€ ν•œ 개 μžˆμŠ΅λ‹ˆλ‹€. 이 futureμ—λŠ” poll λ©”μ„œλ“œκ°€ ν΄λ§ν•˜λŠ” μ€‘μ²©λœ futureκ°€ ν•œ 개 이상 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ€‘μ²©λœ futureλŠ” 일반적인 ν•¨μˆ˜ 호좜 μŠ€νƒν•˜κ³  λΉ„μŠ·ν•œ 역할을 ν•©λ‹ˆλ‹€. ν•œ μž‘μ—… μ•ˆμ—μ„œ μ—¬λŸ¬ μžμ‹ future듀을 ν΄λ§ν•˜λ©΄, 타이머λ₯Ό μΌœλŠ” 것과 μ–΄λ–€ I/Oμž‘μ—…μ„ λ™μ‹œμ— μˆ˜ν–‰μ‹œν‚¨ ν›„ 타이머와 I/O 쀑 λ¨Όμ € λλ‚˜λŠ” 것을 κΈ°λ‹€λ¦¬λŠ” 것과 κ°™μ€λ™μ‹œμ„±λ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

use tokio::io::{self, AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpListener;

#[tokio::main]
async fn main() -> io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:0").await?;
    println!("포트 {}μ—μ„œ μˆ˜μ‹  λŒ€κΈ°", listener.local_addr()?.port());

    loop {
        let (mut socket, addr) = listener.accept().await?;

        println!("{addr:?}μ—μ„œ μ—°κ²°");

        tokio::spawn(async move {
            socket.write_all(b"λˆ„κ΅¬μ„Έμš”?\n").await.expect("μ†ŒμΌ“ 였λ₯˜");

            let mut buf = vec![0; 1024];
            let name_size = socket.read(&mut buf).await.expect("μ†ŒμΌ“ 였λ₯˜");
            let name = std::str::from_utf8(&buf[..name_size]).unwrap().trim();
            let reply = format!("{name}λ‹˜, μ „ν™”ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.\n");
            socket.write_all(reply.as_bytes()).await.expect("μ†ŒμΌ“ 였λ₯˜");
        });
    }
}

이 예제λ₯Ό, 둜컬 컴퓨터에 λ§Œλ“€μ–΄ λ‘” src/main.rs에 λ³΅μ‚¬ν•˜κ³  κ±°κΈ°μ—μ„œ μ‹€ν–‰ν•˜μ„Έμš”.

nc λ˜λŠ” telnetκ³Ό 같은 TCP μ—°κ²° 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ²°ν•΄ λ³΄μ„Έμš”.

  • μˆ˜κ°•μƒλ“€μ—κ²Œ 이 μ„œλ²„μ— λͺ‡ 개의 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λ˜λ©΄ 이 μ„œλ²„μ˜ μƒνƒœκ°€ μ–΄λ–»κ²Œ λ³€ν• μ§€ 그림을 그렀보도둝 ν•˜μ„Έμš”. μ–΄λ–€ νƒœμŠ€ν¬λ“€μ΄ μžˆλŠ”μ§€, 이 νƒœμŠ€ν¬λ“€μ˜ FutureλŠ” μ–΄λ–€ μƒνƒœμ— μžˆλŠ”μ§€ λ¬Όμ–΄λ΄…λ‹ˆλ‹€.

  • This is the first time we’ve seen an async block. This is similar to a closure, but does not take any arguments. Its return value is a Future, similar to an async fn.

  • Async 블둝을 ν•¨μˆ˜λ‘œ λ¦¬νŒ©ν„°λ§ν•˜κ³  ?λ₯Ό μ‚¬μš©ν•˜μ—¬ 였λ₯˜ 처리λ₯Ό κ°œμ„ ν•΄ λ΄…μ‹œλ‹€.