NeuroWhAI의 잡블로그

[Tokio] Rust 비동기 입출력 라이브러리 본문

개발 및 공부/라이브러리&프레임워크

[Tokio] Rust 비동기 입출력 라이브러리

NeuroWhAI 2018. 1. 7. 19:20


Rust 라이브러리인 Tokio를 배우려고 합니다.
일단 공식 홈페이지의 예제를 따라하고 있는데 아는거라곤 문법 뿐이더라고요 하하하하하

직접 하나씩 따라하고 싶으신 분은 아래 링크를 보시면 됩니다.
저는 영어가 안되서 힘들었..ㅠㅠ

아래 코드는 Futures 라이브러리와 Tokio를 써서 숫자가 소수인지 아닌지를 비동기적으로 판별하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
extern crate futures;
extern crate futures_cpupool;
extern crate tokio_timer;
 
use std::time::Duration;
 
use futures::Future;
use futures_cpupool::CpuPool;
use tokio_timer::Timer;
 
 
// 판별할 숫자
const BIG_PRIME: u64 = 15485867;
 
// num이 소수이면 true 아니면 false를 반환
fn is_prime(num: u64-> bool {
    for i in 2..num {
        if num % i == 0 { return false }
    }
    true
}
 
 
fn main() {
    let pool = CpuPool::new_num_cpus();
    let timer = Timer::default();
 
    // 0.75초 뒤에 Err를 반환하는 타이머 생성
    // Future를 반환하기 때문에 0.75초를 여기서 바로 기다리는게 아니라
    // 즉시 반환됩니다.
    let timeout = timer.sleep(Duration::from_millis(750))
        .then(|_| Err(()));
 
    // Ok(bool)을 반환하는 작업 생성
    // 이 역시 Future를 즉시 반환합니다.
    let prime = pool.spawn_fn(|| {
        Ok(is_prime(BIG_PRIME))
    });
 
    // select는 두 Future중 먼저 끝난 Future의 결과값을 첫번째,
    // 덜 끝난 Future를 두번째로 하는 튜플을 계산하는 새로운 Future를 반환합니다.
    // 아래 코드에서는 두번째를 '_'로 무시하고 먼저 계산된 결과를 반환하도록
    // map을 사용하고 있습니다.
    // 고로 winner에는 타이머의 결과인 Err가 들어가거나
    // 소수 여부가 담긴 Ok(bool)가 들어가거나 둘 중 하나일겁니다.
    let winner = timeout.select(prime).map(|(win, _)| win);
 
    // winner Future를 기다려서 결과를 얻고 해당하는 값을 출력합니다.
    match winner.wait() {
        Ok(true=> println!("Prime"),
        Ok(false=> println!("Not prime"),
        Err(_) => println!("Timed out"),
    }
}
 
cs

후아 어렵네요.
그나마 다행인 건 C++에도 future가 있어서 개념 자체는 이미 잡혀있었다는 점?
제목엔 Tokio라고 분류해뒀는데 Futures가 더 많이 설명된것 같은...?





Comments