Docs Menu

非同期 API と同期 API

このガイドでは、Rust ドライバーの非同期API と同期API について学習できます。 このガイドでは、利用可能な API を有効にし、それぞれを使用するようにコードを構造化する方法について説明します。

Rust ドライバーは、デフォルトのランタイムである tokio非同期ランタイム crate をサポートしています。

このドライバーには、ブロッキングが必要なユースケースや並列処理が必要ない場合のための同期 APIも含まれています。 同期 API を選択するには、 Cargo.tomlファイルのmongodb依存関係に機能フラグを追加します。

このガイドには、次のセクションが含まれています。

  • 「非同期ランタイムの構成」では、 tokio非同期ランタイムを使用するようにアプリケーションを構成する方法が表示されます

  • 同期 API の構成ではsynctokio-syncの同期ランタイムを使用するようにアプリケーションを構成する方法が示されています

  • 「 非同期 API と同期 API の両方を使用する 」では、アプリケーションで非同期ランタイム API と同期ランタイム API の両方を有効にする方法が示されています

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

ドライバーはデフォルトでtokioランタイムを使用するため、プロジェクトのCargo.tomlファイルに機能フラグを指定せずにこのランタイムを使用できます。 ドライバーのインストールとCargo.tomlファイルの構成の詳細については、クイック スタートのダウンロードとインストールの手順を参照してください。

重要

Rust ドライバー v 3.0以降では、 tokioランタイムはドライバーがサポートする唯一の非同期ランタイム crate です。 ドライバーの以前のバージョンは、 async-stdランタイム クレートもサポートしています。

アプリケーションでasync-stdランタイムを使用する場合は、 Runtime構造体インスタンスを作成し、 Runtime::spawn()メソッドでドライバー操作をラップすることで、同じアプリケーション内でtokioランタイムを開始できます。 Clientをインスタンス化し、そのClientインスタンスでドライバー メソッドを呼び出すには、同じRuntime インスタンスを使用していることを確認します。

Runtimespawn()をインスタンス化し、 メソッドを呼び出す例については、 tokio のドキュメントを参照してください。

次のコードでは、 tokio crate のtaskモジュールを使用して、複数のデータ操作用に個別の同時タスクを作成します。

let client = Client::with_uri_str("<connection string>").await?;
let some_data = doc! { "title": "1984", "author": "George Orwell" };
for i in 0..5 {
let client_ref = client.clone();
let somedata_ref = some_data.clone();
task::spawn(async move {
let collection = client_ref
.database("items")
.collection::<Document>(&format!("coll{}", i));
collection.insert_one(somedata_ref).await
});
}

このドライバーは、ブロッキング、同期 API も提供します。 tokio同期 API を使用するには、次の例に示すように、 "sync"機能フラグをmongodb依存関係に追加します。

[dependencies.mongodb]
version = "3.2.1"
features = ["sync"]

同期 API を使用する場合、操作を実行するにはmongodb::syncモジュールのタイプを使用します。 次のコードでは、 syncモジュールを使用して、同期 API を使用してコレクションにデータを挿入します。 insert_oneメソッドがforループ内で実行される場合、ドライバーは続行する前に各リクエストが完了するのを待機します。

use mongodb::sync::Client;
fn main() {
let client = Client::with_uri_str("<connection string>")?;
let some_data = doc! { "title": "1984", "author": "George Orwell" };
for i in 0..5 {
let client_ref = client.clone();
let somedata_ref = some_data.clone();
let collection = client_ref
.database("items")
.collection::<Document>(&format!("coll{}", i));
collection.insert_one(somedata_ref);
}
}

同じアプリケーションで非同期 API と同期 API の両方を使用できます。 たとえば、両方のtokioランタイムを有効にするには、 tokio依存関係を依存関係リストに追加し、 mongodb依存関係に"sync"フラグを追加します。

[dependencies]
futures = "0.3.28"
tokio = {version = "1.32.0", features = ["full"]}
[dependencies.mongodb]
version = "3.2.1"
features = ["sync"]

このガイドの概念の詳細については、次のページを参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。