协程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代码)。
4条答案
按热度按时间xytpbqjk1#
IO_PARALLELISM_PROPERTY_NAME
并不引用 Android 系统属性,而是引用Java系统属性。只需在应用早期添加此代码,例如在Application.onCreate()
中的第一个,将其更改为1000
:这并不需要在每台设备上使用root或类似的东西来完成。它将在任何地方工作,因为它是使用常规应用API的常规应用代码。
只要您在第一次使用
Dispatchers.IO
之前执行此操作,就会应用您的属性更改。35g0bw712#
您可以使用任意数量的线程创建自己的调度程序,如下所示
yqlxgs2m3#
使用kotlinx-coroutines-1.6.0,您可以通过使用“limitedParallelism”方法来限制用于Dispatchers的线程。
示例:
发布说明:https://blog.jetbrains.com/kotlin/2021/12/introducing-kotlinx-coroutines-1-6-0/#dispatcher-views-api
qzwqbdag4#
新建Dispatcher
customIODispatcher
是新的Dispatcher,limitedParallelism为256