WorkManager中如何限制并行运行的worker数量?

问题描述 投票:0回答:2

我排队文件(由用户选择)上传,然后像这样使用 WorkManager 更新同步状态:

fun schedule(files: List<String>) {
    var cont = workManager
                .beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
                .then(updateSyncStatusWork)
                .enqueue()
}

效果很好。但是当用户选择很多文件查看日志时,我看到很多文件同时上传(大约 10 个甚至全部)。并且发生了很多超时。我相信减少并行上传的数量会减少超时次数,但我在 WorkManager 或 WorkRequest 中找不到任何允许这样做的 API。

PS 我不考虑将它们链接起来,因为上传失败会放弃所有文件的上传。

android android-workmanager
2个回答
7
投票

可以同时运行的作业数量实际上是由你配置的线程池决定的。默认

Executor
定义here.

通常,当您使用

Worker
基类时,您会将
Worker
的实例关联到此
Executor
上的线程。如果你想更好地控制你的
Worker
与哪个线程相关联,你可能想看看
CoroutineWorker
ListenableWorker

默认

Executor
中的线程数由设备上的核心数决定。如果您只想同时运行
N
个作业,则必须执行以下操作:

  • 禁用默认的

    WorkManager
    初始化器(通过禁用内容提供者的清单合并)。

  • WorkManager
    或您自己的
    Application.onCreate()
    上初始化
    ContentProvider
    。您需要在此处执行此操作,因为操作系统可以要求之前计划的
    Worker
    s 运行。有关更多信息,请查看this.

val configuration = Configuration.Builder()
    // Defines a thread pool with 2 threads. 
    // This can be N (typically based on the number of cores on the device) 
    .setExecutor(Executors.newFixedThreadPool(2))
    .build()

WorkManager.initialize(context, configuration)

在上面的示例中,我正在创建一个具有 2 个线程的固定大小的线程池(这又可以同时处理 2 个

Workers
)。现在,当您对
Worker
进行排队时,您将看到其中只有 2 个同时执行。


0
投票

我遵循了 如何限制在 WorkManager 中并行运行的工作人员数量? 设置新配置。并使用了您的代码片段 尝试使用 workManager.enqueue(listOf<..>) 添加多个作业时 全部同时执行。我希望它们一次最多执行 2 次。但它不起作用

© www.soinside.com 2019 - 2024. All rights reserved.