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でであるAsyncRead
とAsyncWrite
である。AsyncRead
とAsyncWrite
は、バイトストリームからの読み取りとバイトストリームへの書き込みを可能にし、TcpStream、File
、Stdout
などの特定のクラスによって実装される。
Tokioの機能について最後に述べておくこととして、Tokioには、非同期コードを同時に実行するためのselect
と、非同期シーケンスを反復処理するためのStream
トレイトも用意されている。
Tokio 1.0は、APIレベルでの比較的不安定な期間の終わりに来ていると開発者は言っている。これは主に、Rustがasync/await
をサポートするようになったためである。1.0では、Tokioを少なくとも5年間は安定版とすることを計画しており、Tokio 2.0の取り組みを少なくとも3年間開始する予定はない。