WorkManager 是否对同时运行的作业数量有上限?
非常简单的例子:
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
queue.setOnClickListener {
val jobs = mutableListOf<OneTimeWorkRequest>()
for( i in 1..10 ) {
jobs += OneTimeWorkRequestBuilder<MyWorker>()
.setInputData(workDataOf("key" to i))
.build()
}
WorkManager.getInstance().enqueue(jobs)
}
}
}
class MyWorker: Worker() {
override fun doWork(): Result {
val jobId = inputData.getInt("key", -1)
Log.d("worker", "starting job: $jobId")
Completable.timer(10, SECONDS).blockingGet()
Log.d("worker", "job finished: $jobId")
return SUCCESS
}
}
输出:
08-30 14:03:10.392 9825 9855 D worker : starting job: 2
08-30 14:03:10.396 9825 9856 D worker : starting job: 3
08-30 14:03:10.400 9825 9854 D worker : starting job: 1
08-30 14:03:20.421 9825 9855 D worker : job finished: 2
08-30 14:03:20.421 9825 9856 D worker : job finished: 3
08-30 14:03:20.421 9825 9854 D worker : job finished: 1
08-30 14:03:20.442 9825 9856 D worker : starting job: 4
08-30 14:03:20.448 9825 9854 D worker : starting job: 5
08-30 14:03:20.450 9825 9855 D worker : starting job: 6
08-30 14:03:30.444 9825 9856 D worker : job finished: 4
08-30 14:03:30.449 9825 9854 D worker : job finished: 5
08-30 14:03:30.451 9825 9855 D worker : job finished: 6
08-30 14:03:30.474 9825 9856 D worker : starting job: 7
08-30 14:03:30.477 9825 9855 D worker : starting job: 8
08-30 14:03:30.480 9825 9854 D worker : starting job: 9
08-30 14:03:40.476 9825 9856 D worker : job finished: 7
08-30 14:03:40.478 9825 9855 D worker : job finished: 8
08-30 14:03:40.481 9825 9854 D worker : job finished: 9
08-30 14:03:40.497 9825 9856 D worker : starting job: 10
08-30 14:03:50.500 9825 9856 D worker : job finished: 10
最佳答案
可以同时运行的作业数量实际上是由您配置的线程池决定的。默认的 Executor 定义为 here .
通常,当您使用 Worker 基类时,您会将 Worker 的实例关联到此 Executor 上的线程。如果您想更好地控制与 Worker 关联的线程,您可能需要查看 CoroutineWorker 或 ListenableWorker。
默认Executor 中的线程数由设备上的内核数决定。如果您希望所有 10 个作业同时运行,您必须执行以下操作:
禁用默认的 WorkManager 初始化程序(通过为内容提供程序禁用 list 合并)。
在 Application.onCreate() 或您自己的 ContentProvider 上初始化 WorkManager。您需要在此处执行此操作,因为操作系统可以要求之前安排的 Worker 运行。有关详细信息,请参阅 this .
val configuration = Configuration.Builder()
// Defines a thread pool with 10 threads.
// Ideally you would choose a number that is dynamic based on the number
// of cores on the device.
.setExecutor(Executors.newFixedThreadPool(10))
.build()
WorkManager.initialize(context, configuration)
在上面的示例中,我创建了一个固定大小的线程池,其中包含 10 个线程(这又可以处理 10 个 Worker)。现在,当您将 Worker 加入队列时,您会看到它们同时执行。
关于Android WorkManager 并发作业计数/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099624/
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g
我有一个数组:array=['Footballs','Baseball','football','Soccer']而且我需要计算看到Football或Baseball的次数,无论大小写和复数形式如何。这是我尝试做的,但没有成功:array.count{|x|x.downcase.include?'football'||x.downcase.include?'baseball'}编写这段代码的正确或更好的方法是什么?我正在寻找3作为答案。 最佳答案 我会将count与一个block结合使用,该block根据与您正在寻找的约束相匹配的正
下面有没有更优雅的方法来实现这个:输入:array=[1,1,1,0,0,1,1,1,1,0]输出:4我的算法:streak=0max_streak=0arr.eachdo|n|ifn==1streak+=1elsemax_streak=streakifstreak>max_streakstreak=0endendputsmax_streak 最佳答案 类似于w0lf'sanswer,但通过从chunk返回nil来跳过元素:array.chunk{|x|x==1||nil}.map{|_,x|x.size}.max
我有一个bash脚本,它运行一个ruby脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案
我正在尝试在RVM环境中运行10.5的旧PPC机器上运行一个简单的ruby脚本。在SO上搜索,我遵循了这个post中选择的答案.这是cron中的结果行:SHELL=/bin/bash00****BASH_ENV=~/.bash_profile&&/bin/bash-c'~/deggy/onlineGW.rb'此命令在用户sam的根目录下的Bash中运行良好。这是我脚本的重要部分:#!/usr/bin/envrubyrequire'open-uri'require'nokogiri'...这是cron的错误输出:X-Cron-Env:X-Cron-Env:X-Cron-Env:X-C
我正在为在AmazonEC2实例上运行的应用程序设计一个AutoScaling系统。应用程序从SQS读取消息并对其进行处理。AutoScaling系统将监控两件事:SQS中的消息数量,所有EC2机器上运行的进程总数。例如,如果SQS中的消息数量超过3000,我希望系统自动缩放,创建一个新的EC2实例,在其上部署代码,当消息数量低于2000时,我希望系统终止EC2实例.我正在用Ruby和Capistrano做这件事。我的问题是:我无法找到一种方法来确定在所有EC2机器上运行的进程数并将该数字保存在变量中。你能帮帮我吗? 最佳答案 您可