

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# コルーチン
<a name="coroutines"></a>

 AWS SDK for Kotlin はデフォルトで非同期です。SDK for Kotlin は、コルーチンから呼び出されるすべてのオペレーションに `suspend`関数を使用します。

コルーチンの詳細なガイドについては、[公式の Kotlin ドキュメント](https://kotlinlang.org/docs/coroutines-overview.html)を参照してください。

## 同時リクエストの実行
<a name="making-concurrent-requests"></a>

[非同期](https://kotlinlang.org/docs/composing-suspending-functions.html#concurrent-using-async)コルーチンビルダーを使用して、結果を重視する同時リクエストを起動できます。 は、後で結果を提供する promise を表す軽量でノンブロッキングの未来を表す [Deferred](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html) `async`を返します。

結果に関心がない場合 ( オペレーションが完了した場合のみ）、[起動](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html)コルーチンビルダーを使用できます。 `launch`は概念的に に似ています`async`。違いは、起動が[ジョブ](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html)を返し、結果の値は持たず、 は を`async`返すことです`Deferred`。

以下は、[headObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/head-object.html) オペレーションを使用して Amazon S3 への同時リクエストを行い、2 つのキーのコンテンツサイズを取得する例です。

```
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis
import aws.sdk.kotlin.services.s3.S3Client


fun main(): Unit = runBlocking {

    val s3 = S3Client { region = "us-east-2" }
    
    val myBucket = "<your-bucket-name-here>"
    val key1 = "<your-object-key-here>"
    val key2 = "<your-second-object-key-here>"

    val resp1 = async {
        s3.headObject{
            bucket = myBucket
            key = key1
        }
    }

    val resp2 = async {
        s3.headObject{
            bucket = myBucket
            key = key2
        }
    }


    val elapsed = measureTimeMillis {
        val totalContentSize = resp1.await().contentLength + resp2.await().contentLength
        println("content length of $key1 + $key2 = $totalContentSize")
    }

    println("requests completed in $elapsed ms")

}
```

## ブロックリクエストの実行
<a name="making-clocking-requests"></a>

コルーチンを使用せず、別のスレッドモデルを実装する既存のコードからサービス呼び出しを行うには、[runBlocking](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) コルーチンビルダーを使用できます。別のスレッドモデルの例としては、Java の従来のエグゼキュター/未来アプローチの使用が挙げられます。Java と Kotlin のコードまたはライブラリをブレンドする場合は、このアプローチを使用する必要がある場合があります。

名前が示すように、この`runBlocking`ビルダーは新しいコルーチンを起動し、完了するまで現在のスレッドをブロックします。

**警告**  
 `runBlocking` 通常、コルーチンからは使用しないでください。これは、通常のブロッキングコードを一時停止スタイルで記述されたライブラリ (主要な関数やテストなど) にブリッジするように設計されています。