

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 协程
<a name="coroutines"></a>

默认情况下 适用于 Kotlin 的 AWS SDK 是异步的。适用于 Kotlin 的 SDK 对所有操作都使用`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)协程生成器可用于在您关心结果的地方启动并发请求。 `async`返回一个 De [f](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html) erred，它代表一个轻量级、非阻塞的未来，代表着稍后提供结果的承诺。

如果您不关心结果（只关心操作已完成），则可以使用[启动](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html)协程生成器。 `launch`在概念上类似于。`async`不同之处在于，launch 返回一个 [Job](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html) 并且不携带任何结果值，而`async`返回 a `Deferred`。

以下是使用 He [adObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3/head-object.html) 操作向 Amazon S3 发出并发请求以获取两个密钥内容大小的示例：

```
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>

要使用不使用协程并实现不同线程模型的现有代码进行服务调用，可以使用 [run](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) Blocking 协程生成器。不同线程模型的一个例子是使用 Java 的传统 executors/futures 方法。如果您要混合 Java 和 Kotlin 代码或库，则可能需要使用这种方法。

顾名思义，这个`runBlocking`生成器会启动一个新的协程并屏蔽当前线程，直到它完成。

**警告**  
 `runBlocking`通常不应从协程中使用。它旨在将常规阻塞代码与以暂停方式编写的库（例如在主函数和测试中）连接起来。