러스트 비동기

다메즈마 (토론 | 기여)님의 2019년 12월 15일 (일) 23:19 판 (새 문서: ==시작하기== 러스트의 비동기 프로그래밍에 오신 것을 환영합니다! 비동기 러스트 코드를 작성하기 위해 보는 거라면 제대로 오신 것입니...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

시작하기

러스트의 비동기 프로그래밍에 오신 것을 환영합니다! 비동기 러스트 코드를 작성하기 위해 보는 거라면 제대로 오신 것입니다. 웹 서버든 데이버베이스든 운영체제든, 구축하기 위하여 이 책은 하드웨어의 최대한 사용할 수 있는 러스트의 비동기 프로그래밍 도수를 어떻게 사용하는 지 알려 줄 것입니다.

이 책은 러스트의 비동기 언어 기능과 라이브러리를 사용하기 위한 포괄적이고 최신 가이드를 목표하며 입문자와 전문가를 대상으로 합니다.

  • 초기 장들에서는 포괄적인 비동기 프로그래밍과 러스트에 있는 비동기가 어떻게 사용할 수 있는 지 소개합니다.
  • 중간 장들에서는 비동기 코드를 작성할 때 사용할 수 있는 핵심 유틸리티와 흐름 제어 도구에 대해서 논의하고 퍼포먼스와 재사용성을 최대화한 라이브러리와 애플리케이션을 구축하기 위한 최고의 실습을 서술합니다.
  • 마지막 장들에서는 폭넓은 비동기 생태계를 알려주고 일반적인 작업을 수행하는 방법에 대한 많은 예제를 제공합니다.

왜 비동기인가?

우리 모두 안전한 소프트웨어를 빠르게 작성하게 해주는 러스트를 얼마나 좋아하는가! 그러나 왜 비동기 코드를 작성해야 하는가?

비동기 코드는 동일한 커널 레벨 스레드에서 다수의 테스크를 동시적으로 실행할 수 있게 해줍니다. 전통적인 멀티 스레드 애플리케이션에서는 만약 동시에 다른 두 웹페이지를 다운로드하려면 이렇게 두 스레드에서 일을 작업해야 했습니다.

fn get_two_sites() {
    // Spawn two threads to do work.
    let thread_one = thread::spawn(|| download("https://www.foo.com"));
    let thread_two = thread::spawn(|| download("https://www.bar.com"));

    // Wait for both threads to complete.
    thread_one.join().expect("thread one panicked");
    thread_two.join().expect("thread two panicked");
}

이것은 많은 애플리케이션에서 잘 동작합니다. 결국 스레드들은 한 번에 여러 다른 작업을 동작시키기 위해 디자인되었습니다. 그러나, 이런 방식은 몇몇 제한을 가지고 오기도 하는데 한 프로세스 내에서 스레드들의 스위칭를 하며 스레드 사이에서 데이터를 공유하느라 많은 오버헤드가 생깁니다. 심지어 스레드가 아무런 일도 안 하고 가만히 있더라도 귀한 시스템 리소스를 사용합니다. 이런 비용를 제거하기 위해 비동기 코드가 디자인되었습니다. 따라서 위의 함수를 러스트의 async/.await 표기를 이용하여 재작성할 수 있습니다. async/.await는 복수의 스레드를 생성하지 않아도 동시에 여러 작업을 돌릴 수 있게 해줍니다.

async fn get_two_sites_async() {
    // Create two different "futures" which, when run to completion,
    // will asynchronously download the webpages.
    let future_one = download_async("https://www.foo.com");
    let future_two = download_async("https://www.bar.com");

    // Run both futures to completion at the same time.
    join!(future_one, future_two);
}

종합하여 비동기 애플리케이션은 거의 동일한 작업을 하는 멀티 스레드 구현보다 더 빠르고 더 적은 리소스를 사용할 수 있는 잠재려을 가집니다. 그러나 대가가 존재합니다. 스레드는 운영체제에서 네이티브하게 지원되고 그다지 특별한 프로그래밍 모델, 예를 들면 어떤 함수든 스레드를 생성할 수 있고 스레드를 사용하기 위한 함수를 호출하는 것은 다른 어떤 일반적인 함수들만큼 쉽습니다,이 없습니다. 그러나 비동기 함수는 언어나 라이브러리에서 별도의 지원이 필요합니다. 러스트에서는 async fnFuture를 반환하는 비동기 함수를 만듭니다. 함수 내용을 실행하기 위해서는 반환된 Future이 완료를 위해서 실행되어야 합니다.

전통적인 멀티스레드 애플리케이션이 꽤 효과적이었고 러스트의 작은 메모리 공간과 async를 사용하지 않아도 얻을 수 있는 예측 가능성를 안 잊는 것은 중요합니다. 비동기 프로그래밍 모델의 증가된 복잡함은 언제나 할 가치가 있는 것은 아니고 무슨 애플리케이션을 고려하든 더 단순한 스레드 모델을 사용하는 것이 중요합니다.

비동기 러스트의 상태