多くのファイルをS3にアップロードする必要があります。そのジョブを順番に完了するまでに数時間かかることがあります。それがまさにコトルの新しいコルーチンの優れた点です。そこで、私は、スレッドベースの実行サービスをもう一度やってみるのではなく、まず最初に試してみたかったのです。Kotlin Coroutinesによる同時S3ファイルアップロード
fun upload(superTiles: Map<Int, Map<Int, SuperTile>>) = runBlocking {
val s3 = AmazonS3ClientBuilder.standard().withRegion("eu-west-1").build()
for ((x, ys) in superTiles) {
val jobs = mutableListOf<Deferred<Any>>()
for ((y, superTile) in ys) {
val job = async(CommonPool) {
uploadTile(s3, x, y, superTile)
}
jobs.add(job)
}
jobs.map { it.await() }
}
}
suspend fun uploadTile(s3: AmazonS3, x: Int, y: Int, superTile: SuperTile) {
val json: String = "{}"
val key = "$s3Prefix/x4/$z/$x/$y.json"
s3.putObject(PutObjectRequest("my_bucket", ByteArrayInputStream(json.toByteArray()), metadata))
}
問題:ここで
は私の(簡体字)のコードであるコードはまだ非常に遅く、ロギングは要求がまだ順次実行されていることが明らかになった:次のいずれかが作成される前に、ジョブが終了します。非常に少数のケース(10のうち1)だけで、同時に実行されているジョブがあります。
なぜコードはそれほど速く/同時に実行されませんか?それについて私は何ができますか?
無教育推測:複数のクライアントを持つように非同期セクション内の 'val s3 = AmazonS3ClientBuilder ... 'を移動しますか? –
はどちらもうまくいきませんでした。私の無教養の推測は今、 'putObject'が要求をブロックしていることです。コルーチンは何も変更できません。 – linqu
正確です。 S3 SDKはノンブロッキングIO(NIO経由)をサポートしていないようですので、アップロードごとに1つのスレッドが必要です。複数のパラレルで実行することはできますが、並行して実行することはお勧めできません。ある時点では、ネットワーク帯域幅によっても制限されます。 – diesieben07