非同期 API と同期 API
Overview
このガイドでは、Rust ドライバーの非同期API と同期API について学習できます。 このガイドでは、利用可能な API を有効にし、それぞれを使用するようにコードを構造化する方法について説明します。
Rust ドライバーは、デフォルトのランタイムである tokio
非同期ランタイム crate をサポートしています。
このドライバーには、ブロッキングが必要なユースケースや並列処理が必要ない場合のための同期 APIも含まれています。 同期 API を選択するには、 Cargo.toml
ファイルのmongodb
依存関係に機能フラグを追加します。
このガイドには、次のセクションが含まれています。
「非同期ランタイムの構成」では、
tokio
非同期ランタイムを使用するようにアプリケーションを構成する方法が表示されます同期 API の構成では、
sync
とtokio-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
インスタンスを使用していることを確認します。
Runtime
spawn()
をインスタンス化し、 メソッドを呼び出す例については、 tokio のドキュメントを参照してください。
topic ランタイムの例
次のコードでは、 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 の設定
このドライバーは、ブロッキング、同期 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 の両方を使用する
同じアプリケーションで非同期 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 ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。