【问题标题】:How to increase Kotlin coroutines Dispatchers.IO size on Android?如何在 Android 上增加 Kotlin 协程 Dispatchers.IO 的大小?
【发布时间】:2019-10-22 01:19:39
【问题描述】:

协程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. 文档中隐含的属性是否确实是我尝试更改的“系统属性”?
  2. 如何在非 root 设备上为我的应用的所有用户更改此属性?
  3. 还有更好的选择吗?

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

【问题讨论】:

    标签: android kotlin kotlin-coroutines


    【解决方案1】:

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

    【讨论】:

    • 这正是我想要的。经过测试,它可以工作。非常感谢。你认为它还会改变我可能导入的库中 Dispatchers.IO 的大小吗?
    • Dispatchers.IO 是一个应用程序范围的单例。如果依赖项使用协程,它仍将使用与您自己的代码相同的协程库,因此使用相同的线程池。
    【解决方案2】:

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

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

    【讨论】:

    • 非常方便,谢谢。但是,如果我没记错的话,它只解决了部分问题。如果我导入的其中一个库在内部使用 Dispatchers.IO 怎么办?
    • 是的,仅解决了具有阻塞代码的高度多线程应用程序的问题,我不确定您是否可以更改库如何使用调度程序。
    猜你喜欢
    • 2020-04-24
    • 2019-06-06
    • 2015-01-04
    • 2019-09-28
    • 2014-10-15
    • 2021-07-19
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多