如何在 WorkManager 中限制并行工作器的数量 运行?
How do I limit a number of workers running in parallel in WorkManager?
我将要上传的文件(由用户选择)排入队列,然后像这样使用 WorkManager 更新同步状态:
fun schedule(files: List<String>) {
var cont = workManager
.beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
.then(updateSyncStatusWork)
.enqueue()
}
效果很好。但是当用户选择很多文件查看日志时,我看到很多文件同时上传(大约 10 个甚至全部)。并且发生了很多超时。我相信减少并行上传的数量会减少超时次数,但我在 WorkManager 或 WorkRequest 中找不到任何允许这样做的 API。
PS 我不考虑将它们链接起来,因为上传失败将放弃上传之后的所有文件。
同时可以运行的作业数量实际上是由您配置的线程池决定的。默认 Executor
定义为 here.
通常,当您使用 Worker
基础 class 时,您会将 Worker
的实例关联到此 Executor
上的线程。如果您想更好地控制 Worker
与哪个线程关联,您可能需要查看 CoroutineWorker
或 ListenableWorker
。
默认Executor
中的线程数由设备上的内核数决定。如果您只想同时 运行 N
个作业,则必须执行以下操作:
禁用默认的 WorkManager
初始化器(通过禁用内容提供者的清单合并)。
在 Application.onCreate()
或您自己的 ContentProvider
上初始化 WorkManager
。您需要在此处执行此操作,因为 OS 可以向 运行 请求先前安排的 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 个同时执行。
我将要上传的文件(由用户选择)排入队列,然后像这样使用 WorkManager 更新同步状态:
fun schedule(files: List<String>) {
var cont = workManager
.beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
.then(updateSyncStatusWork)
.enqueue()
}
效果很好。但是当用户选择很多文件查看日志时,我看到很多文件同时上传(大约 10 个甚至全部)。并且发生了很多超时。我相信减少并行上传的数量会减少超时次数,但我在 WorkManager 或 WorkRequest 中找不到任何允许这样做的 API。
PS 我不考虑将它们链接起来,因为上传失败将放弃上传之后的所有文件。
同时可以运行的作业数量实际上是由您配置的线程池决定的。默认 Executor
定义为 here.
通常,当您使用 Worker
基础 class 时,您会将 Worker
的实例关联到此 Executor
上的线程。如果您想更好地控制 Worker
与哪个线程关联,您可能需要查看 CoroutineWorker
或 ListenableWorker
。
默认Executor
中的线程数由设备上的内核数决定。如果您只想同时 运行 N
个作业,则必须执行以下操作:
禁用默认的
WorkManager
初始化器(通过禁用内容提供者的清单合并)。在
Application.onCreate()
或您自己的ContentProvider
上初始化WorkManager
。您需要在此处执行此操作,因为 OS 可以向 运行 请求先前安排的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 个同时执行。