Robert Kempton
06/06/2022, 4:32 PMRobert Kempton
06/06/2022, 4:34 PMakatkov
06/06/2022, 4:39 PMval allTasks = mutableListOf<Task>()
val semaphore = Semaphore(20)
for (taskBatch in allTasks.chunked(1000)) {
val completedTasks = taskBatch.map { task ->
// run on IO dispatcher
async(<http://Dispatchers.IO|Dispatchers.IO>) {
// only allow 20 tasks to be running at a time
semaphore.withPermit {
task.run()
}
}
}.awaitAll()
// do something with completedTasks -- report results, etc.
}
akatkov
06/06/2022, 4:41 PMRobert Kempton
06/06/2022, 4:58 PMRobert Kempton
06/06/2022, 4:59 PMjw
06/06/2022, 5:50 PMval channel = Channel(1000)
launch {
// feed into channel
}
repeat(20) {
launch {
for (message in channel) {
// do something
}
}
}
Robert Kempton
06/06/2022, 5:52 PMephemient
06/07/2022, 4:08 AMFlow
, you can
flow.flatMapMerge(concurrency = 20) { message ->
flow {
// do something
}
}.collect()
although it definitely doesn't feel like an intuitive use of the API to meephemient
06/07/2022, 4:11 AMproduce {
// feed into this channel
}.consume {
coroutineScope {
repeat(20) {
launch {
for (message in this@consume) {
// do something
}
}
}
}
}