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

Vas*_*liy 7 android kotlin kotlin-coroutines

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

文档指出

该池中的其他线程被创建并按需关闭。此调度程序使用的线程数受“kotlinx.coroutines.io.parallelism”(IO_PARALLELISM_PROPERTY_NAME)系统属性值的限制。它默认为 64 个线程的限制或内核数(以较大者为准)。

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

adb shell "setprop kotlinx.coroutines.io.parallelism 1000"
Run Code Online (Sandbox Code Playgroud)

然后我得到以下结果:

setprop: failed to set property 'kotlinx.coroutines.io.parallelism' to '1000'
Run Code Online (Sandbox Code Playgroud)

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

所以,在这种情况下,我有三个问题:

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

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

Ens*_*lic 10

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));
Run Code Online (Sandbox Code Playgroud)

但这不是必须在每台设备上有根之类的东西来完成。它可以在任何地方使用,因为它是使用常规应用程序 API 的常规应用程序代码。

只要您Dispatchers.IO在第一次使用之前执行此操作,您的属性更改就会生效。

  • 这正是我一直在寻找的。经过测试,它有效。多谢。您认为它还会改变我可能导入的库中 Dispatchers.IO 的大小吗? (2认同)
  • `Dispatchers.IO` 是一个应用程序范围的单例。如果依赖项使用协程,它仍将使用与您自己的代码相同的协程库,因此使用相同的线程池。 (2认同)

Fra*_*esc 9

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

val dispatcher = Executors.newFixedThreadPool(128).asCoroutineDispatcher()
Run Code Online (Sandbox Code Playgroud)