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

How to increase Kotlin coroutines Dispatchers.IO size on Android?

协程 Dispatchers.IO 上下文限制为 64 个线程。这不足以可靠地与高并发系统中的阻塞代码交互。

Documentation states 即:

Additional threads in this pool are created and are shutdown on demand. The number of threads used by this dispatcher is limited by the value of “kotlinx.coroutines.io.parallelism” (IO_PARALLELISM_PROPERTY_NAME) system property. It defaults to the limit of 64 threads or the number of cores (whichever is larger).

我想将 kotlinx.coroutines.io.parallelism 系统 属性 更改为其他内容。但是,如果我这样做:

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

然后我得到以下结果:

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

此外,如果我想发布我的应用程序,那么我也需要在用户的设备上更改此 属性,对吗?否则该应用程序将无法运行。然而,即使假设这是可能的,据我所知,所有更改此 属性 的应用程序都会覆盖彼此的设置。这听起来不像是一种可靠的操作模式。

所以,在这方面我有三个问题:

  1. 文档中隐含的 属性 是否确实是我试图更改的 "system property"?
  2. 如何在非 root 设备上为我的应用程序的所有用户更改此 属性?
  3. 有更好的选择吗?

P.S。我知道如果我只使用协程而不阻塞代码,这将不是问题(可能)。但是我们假设我需要使用阻塞调用(例如遗留 Java 代码)。

您可以使用任意数量的线程创建自己的调度程序,就像这样

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

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 之前执行此操作,就会应用您的 属性 更改。

在 kotlinx-coroutines-1.6.0 中,您可以使用“limitedParallelism”方法限制用于调度程序的线程。

示例:

// 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