BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Rustの非同期ランタイムであるTokioが1.0に到達

Rustの非同期ランタイムであるTokioが1.0に到達

原文(投稿日:2021/01/06)へのリンク

Tokioは、Rustで信頼性が高く高速な非同期プログラムを作成するためのビルディングブロックを提供することを目指している。最近発表されたTokio 1.0は、TCP、UDP、タイマー、マルチスレッドのワークスティーリングスケジューラなどをサポートしている。

これは、ソケットで着信要求を待機し、それを処理するスレッドを生成するサービスを定義する方法についての最もシンプルな例である。

use tokio::net::{TcpListener, TcpStream};
let mut listener = TcpListener::bind(&addr).await?;

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

    tokio::spawn(async move {
        // handle request
    });
}

Tokioは、協調マルチタスクを使用して、asyncブロックとして実装された複数のグリーンスレッドを実行する。これは、正常に動作するタスクは、効率的なタスクの多重化を可能にし、飢えを防ぐために、Tokioのスケジューラーに制御を戻す必要があることを意味する。

Tokioは、tokio::sync::Mutexまたはchannelsを使用して、接続間で状態を共有するためのサポートも提供する。Tokioミューテックスは、asyncコンテキストで安全に使用できる。次に例を示す。

async fn increment_and_do_stuff(mutex: &tokio::sync::Mutex<i32>) {
    let mut lock = mutex.lock().await;
    *lock += 1;

    do_something_async().await;
} // lock goes out of scope here

ただし、このアプローチは、最もシンプルなケースにのみお勧めする。むしろ、チャネルはほとんどの場合に推奨されるアプローチである。それには、状態を管理し、メッセージパッシングを使用して状態を変更するための専用スレッドを生成することが含まれる。Tokioは、マルチプロデューサー・シングルコンシューマーシングルプロデューサー・シングルチャネルマルチプロデューサー・マルチコンシューマーシングルプロデューサー・マルチコンシューマーなど、さまざまなチャネルタイプのサポートする。

Tokioがカバーするもう1つの機能領域は、2つの基本的な特性を備えた非同期I/OでであるAsyncReadAsyncWriteである。AsyncReadAsyncWriteは、バイトストリームからの読み取りとバイトストリームへの書き込みを可能にし、TcpStream、FileStdoutなどの特定のクラスによって実装される。

Tokioの機能について最後に述べておくこととして、Tokioには、非同期コードを同時に実行するためのselectと、非同期シーケンスを反復処理するためのStreamトレイトも用意されている。

Tokio 1.0は、APIレベルでの比較的不安定な期間の終わりに来ていると開発者は言っている。これは主に、Rustがasync/awaitをサポートするようになったためである。1.0では、Tokioを少なくとも5年間は安定版とすることを計画しており、Tokio 2.0の取り組みを少なくとも3年間開始する予定はない。

この記事に星をつける

おすすめ度
スタイル

BT