【发布时间】:2019-11-20 17:03:56
【问题描述】:
我有一个需要从 Web 服务检索的项目列表。似乎最好的方法是通过频道,但我无法让它们同时运行。为简单起见,我将问题简化为一个带有模拟网络调用循环的小应用程序。
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.text.SimpleDateFormat
import java.util.*
import kotlin.random.Random
private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
private val sdf =SimpleDateFormat("YYYY-MM-dd kk:mm:ss.SSSS")
const val NUMBER_OF_LOOPS = 5
fun main() = runBlocking<Unit> {
val channel = Channel<String>()
log("First thing")
repeat(NUMBER_OF_LOOPS) {
launch {
channel.send(getValue(it))
}
}
log("Second Thing")
launch {
repeat(NUMBER_OF_LOOPS) {
val value = channel.receive()
log(value)
}
}
log("All Done.")
}
fun getValue(i: Int): String {
log(String.format("Starting value for %d", i))
var rand: String = ""
repeat(100000) {
rand = (1..256)
.map { Random.nextInt(0, charPool.size) }
.map(charPool::get)
.joinToString("")
}
log(String.format("Done processing for %d", i))
return rand
}
fun log(value: String){
println(String.format("%s %s", sdf.format(Date()), value))
}
当我运行它时,我得到以下输出。
2019-11-20 10:57:00.0473 First thing
2019-11-20 10:57:00.0484 Second Thing
2019-11-20 10:57:00.0485 All Done.
2019-11-20 10:57:00.0495 Starting value for 0
2019-11-20 10:57:02.0489 Done processing for 0
2019-11-20 10:57:02.0495 Starting value for 1
2019-11-20 10:57:03.0898 Done processing for 1
2019-11-20 10:57:03.0898 Starting value for 2
2019-11-20 10:57:05.0270 Done processing for 2
2019-11-20 10:57:05.0270 Starting value for 3
2019-11-20 10:57:06.0607 Done processing for 3
2019-11-20 10:57:06.0607 Starting value for 4
2019-11-20 10:57:07.0930 Done processing for 4
2019-11-20 10:57:07.0930 YxjtbzPR29etkoCg6yR64XwepRPDHGaS8MAp4M16FLyEIaVUcqtx6RSaBaWmB5MyDh60Xo7a6aOSfwmLOvdt2Ppyj3K8OpWjhQ5BuC6aHVrPmQwau5PLROIWSIU0wrLl7mrYhDJSSfFPRUATXxFz0viDvzx4q88q8Nm9b3LPu264bR0kYrQk2sGQATQLRxR7DcsgKAvCvFKy8Ba0VYcKreJKAWOeUVYkvFTW9rPJ2X8FkwhzqeuNlWeK27v60CSB
2019-11-20 10:57:07.0930 n9uOCwuIlKX4PcWcFUhKfr96Topoht67h0wt1JHTAzIGxaRnHd92wW3wdghWaPxL9WuCE2ICfwHY5NCq1PYAekaCKEPvb46Ouz4TzFgGy0j3xZdwgyVqS4pmQJvl7hvhjldvouhxFfkt1DLeNAyai7J2CMFvWhDsFsNy0S0jsJfMfI9TV9N7U02u74rnwR5hZb2RfLJgfYf77GtS8jkf0QXufnhJmt8MYsx7BGLi9vrhgH0qcaLdA2bDspia767s
2019-11-20 10:57:07.0930 ljfUduDQunB2YsHI0ZO7HRXEbqSbozIKivbge0DIFuNgI7cAvPIofQhBiVU2sTfhswr9zpRd30aKZzE3zprU5oPg70RuTSAAbDaVr06nd4IARi8WbfthpPVP3FIk4ScezMH4I47FmoNuwMmTxyLrtskWWqInJn8WA0U7Riq4pNG7y8CKiXgiytWH09QXJvNMG7Wzd3ApIUyx45ljCOZUHDiORsGWRcQnf9ngv56d9qGBYJOqfHKALiJnca9CoJSN
2019-11-20 10:57:07.0931 LkoTs8Oa8cxd3NUEKK1snRZPguYFTtDQJcJ4kYDaDYpjBOScnziEbr2OuLsCHfXgBNFc3ZzejKCLwN3oCT5l24iILkpm7122ktoOGPXtMwNBoEuB4oK83xqm6P7YKX7YU3LK1njio5zzdbPhfc0Qyrym1qyBVQnr3c4dJds1zMYDTAfZJ0o8Wyi5R8XJ7bH8aiCXziozaEELa80CWM3mDymjSWMnihDjfJlasO3cFHP4q2vpsLzqnxqTfS9WKGNv
2019-11-20 10:57:07.0931 6wDtTynt8htbfm28ipVHOZ961TdoLZomAk2cv7GzvptFqlKnU71Y5U22n75i9AQloZpFAbGdEXHduYKWoAHvi8mmPCmK7X1y8wUjqHWYEC4GFgGbrzM4lIPAKp1WagqnL3gndpGMPwY1WpiXtpjqtgGCNb26TEsF178uXgMHk5i8V46bBBNGPFPTtACCn5Ga5myv7GAcwWpGcl4yHkBpxSVuqA1bhssJ4KhIvwexPH159ePeeaixeIBZQTfwDl86
我希望所有“起始值...”日志都显示在任何“完成处理”日志之前,但您可以看到它们都在同步运行。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: asynchronous kotlin coroutine