我需要将许多文件上传到 S3,按顺序完成这项工作需要几个小时。这正是 Kotlin 的新协程擅长的地方,所以我想先尝试一下,而不是再摆弄一些基于线程的执行服务。
这是我的(简化的)代码:
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))
}
问题:代码仍然很慢,日志显示请求仍然按顺序执行:一个作业在创建下一个作业之前完成。只有在极少数情况下(十分之一)我看到作业同时运行。
为什么代码不能更快/同时运行?我能做些什么呢?