I'm building a massively concurrent system with co...
# coroutines
m
I'm building a massively concurrent system with coroutines, have thousands of coroutines running at a time, and have 100% CPU usage most of the time. It all works great, but how can I give some coroutines higher priority? Sometimes I have work incoming that should be completed first, but because the application is already busy with other stuff the priority work has to wait for other work to finish before being processed. Alternatively, how can I start some coroutines on a low-priority thread, which should let me achieve the same goal?
o
make your own dispatcher using
Executor.asCoroutineDispatcher()
m
Oh, that makes sense, I was looking at CoroutineDispatchers but haven't seen that you can make one from an Executor. Thank you.
d
If your only using 1 thread currently ( what I interpreted as 100% cpu and massive coroutine use) - then you dont need your own dispatcher you can just use the Default instead of Main dispatcher -- depends on what your currently useing https://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html#dispatchers-and-threads and/or newSingleThreadContext or newFixedThreadPoolContext https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/index.html Or create your own thread pool and executor and manually or dynamically assign thread priorities. For your case you probably don't need to write a full dispatcher.
m
Copy code
fun createCoroutineDispatcher(priority: Int): CoroutineDispatcher {
    return Executors.newCachedThreadPool(ThreadFactory {
        return@ThreadFactory Thread(it).apply {
            this.priority = priority
        }
    }).asCoroutineDispatcher()
}
I created a dispatcher like this, allowing me to set priority. Seems to work. @DALDEI