如何在Android上增加Kotlin协程Dispatchers.IO大小?

ejk8hzay  于 2023-04-07  发布在  Kotlin
关注(0)|答案(4)|浏览(215)

协程Dispatchers.IO上下文限制为64个线程。这不足以在高并发系统中可靠地与阻塞代码接口。
Documentation states
将创建此池中的其他线程,并按需关闭这些线程。此调度程序使用的线程数受“kotlinx.coroutines.io.parallelism”(IO_PARALLELISM_PROPERTY_NAME)系统属性值的限制。默认限制为64个线程或核心数(以较大者为准)。
我想将kotlinx.coroutines.io.parallelism系统属性更改为其他属性。但是,如果我这样做:

adb shell "setprop kotlinx.coroutines.io.parallelism 1000"

然后我得到以下结果:

setprop: failed to set property 'kotlinx.coroutines.io.parallelism' to '1000'

此外,如果我想发布我的应用程序,那么我也需要在用户的设备上更改此属性,对吗?否则应用程序将无法工作。然而,即使假设这是可能的,据我所知,所有更改此属性的应用程序都会覆盖彼此的设置。这听起来不像是一种可靠的操作模式。
因此,在这方面我有三个问题:
1.文档中隐含的属性是否确实是我试图更改的“系统属性”?
1.如何在非root设备上为我的应用的所有用户更改此属性?
1.有更好的选择吗?
P.S.我知道如果我只使用协程,而不使用阻塞代码,这不会是一个问题(可能)。但是让我们假设我需要使用阻塞调用(例如遗留的Java代码)。

xytpbqjk

xytpbqjk1#

IO_PARALLELISM_PROPERTY_NAME并不引用 Android 系统属性,而是引用Java系统属性。只需在应用早期添加此代码,例如在Application.onCreate()中的第一个,将其更改为1000

import static kotlinx.coroutines.DispatchersKt.IO_PARALLELISM_PROPERTY_NAME;

System.setProperty(IO_PARALLELISM_PROPERTY_NAME, Integer.toString(1000));

这并不需要在每台设备上使用root或类似的东西来完成。它将在任何地方工作,因为它是使用常规应用API的常规应用代码。
只要您在第一次使用Dispatchers.IO之前执行此操作,就会应用您的属性更改。

35g0bw71

35g0bw712#

您可以使用任意数量的线程创建自己的调度程序,如下所示

val dispatcher = Executors.newFixedThreadPool(128).asCoroutineDispatcher()
yqlxgs2m

yqlxgs2m3#

使用kotlinx-coroutines-1.6.0,您可以通过使用“limitedParallelism”方法来限制用于Dispatchers的线程。
示例:

// 100 threads for MySQL connection
val myMysqlDbDispatcher = Dispatchers.IO.limitedParallelism(100)
// 60 threads for MongoDB connection
val myMongoDbDispatcher = Dispatchers.IO.limitedParallelism(60)

发布说明:https://blog.jetbrains.com/kotlin/2021/12/introducing-kotlinx-coroutines-1-6-0/#dispatcher-views-api

qzwqbdag

qzwqbdag4#

    • 整个系统都这样用**
System.setProperty(IO_PARALLELISM_PROPERTY_NAME, Integer.toString(256));

新建Dispatcher

val customIODispatcher = Dispatchers.IO.limitedParallelism(256)
launch(customIODispatcher) {
      //...
}

customIODispatcher是新的Dispatcher,limitedParallelism为256

相关问题