如何在 Android 上增加 Kotlin 协程 Dispatchers.IO 的大小?
How to increase Kotlin coroutines Dispatchers.IO size on Android?
协程 Dispatchers.IO
上下文限制为 64 个线程。这不足以可靠地与高并发系统中的阻塞代码交互。
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'
此外,如果我想发布我的应用程序,那么我也需要在用户的设备上更改此 属性,对吗?否则该应用程序将无法运行。然而,即使假设这是可能的,据我所知,所有更改此 属性 的应用程序都会覆盖彼此的设置。这听起来不像是一种可靠的操作模式。
所以,在这方面我有三个问题:
- 文档中隐含的 属性 是否确实是我试图更改的 "system property"?
- 如何在非 root 设备上为我的应用程序的所有用户更改此 属性?
- 有更好的选择吗?
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
协程 Dispatchers.IO
上下文限制为 64 个线程。这不足以可靠地与高并发系统中的阻塞代码交互。
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'
此外,如果我想发布我的应用程序,那么我也需要在用户的设备上更改此 属性,对吗?否则该应用程序将无法运行。然而,即使假设这是可能的,据我所知,所有更改此 属性 的应用程序都会覆盖彼此的设置。这听起来不像是一种可靠的操作模式。
所以,在这方面我有三个问题:
- 文档中隐含的 属性 是否确实是我试图更改的 "system property"?
- 如何在非 root 设备上为我的应用程序的所有用户更改此 属性?
- 有更好的选择吗?
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