我有 10 个计算作业,需要(接近)无限时间。例如:计算PI的下一位,solve一个NP-hard约束满足问题等。
我有 4 个线程(所以在一台有 8 个内核 的机器上有一个有 4 个线程的线程池,所以我还有一些内核可以避免活锁机器和过程)。
使用 Java 8,如何在这 4 个线程中分配这 10 个作业?
这是个坏主意:
ExecutorService es = Executors.newFixedThreadPool(4);
for (Job j : jobs) {
es.submit(j);
}
因为 4 个工作将开始,但没有一个完成,所以工作 5-10 永远不会开始。
例如,如果我查看 10 分钟,我预计每个作业运行了大约 4 分钟。 20 分钟后,每个作业运行了大约 8 分钟,等等。处理这个问题的典型模式是什么? (如果需要,我可以实现一种在预设时间后暂停计算的方法。)
最佳答案
在四个线程之间分配十个作业的任务和你的十个作业只使用四个 CPU(我在这里使用 CPU 作为 core 的同义词,为了简单起见)的任务有点不同。
四个线程
将线程数限制为四个并不能保证它们会坚持使用四个 CPU 而不会使用其他的。允许操作系统根据需要在所有可用 CPU 之间随机播放您的线程。您唯一可以保证的是,您的程序将无法使用超过 50% 的所有 CPU 资源(假设您有八个 CPU)。
但您不太可能设法利用这 50%。尽管您的作业主要是面向 CPU 的,但它们仍然可能需要不时地读取和写入内存。当线程在此类读/写上错过缓存并等待数据传递给处理器时,该处理器会暂停该线程并可以在另一个线程中执行某些工作。在您的情况下,它将无事可做,只是闲置直到数据到达。因此,您的 CPU 很可能未得到充分利用。
如果你决定采用这种方法,你需要将你的工作分解成小任务并将它们提供给执行者,正如@James Large 所说。您可以将 WorkStealingPool 与四个线程一起使用(正如@Alexey Soshin 所建议的那样),或者创建一个包含十个线程的池并使用一个 Semaphore 将四个许可和公平性设置为 真。在后一种情况下,您的线程必须使用循环,在每次迭代开始时获取许可并在结束时释放它们。每次迭代将代表一小部分工作。
四个 CPU
有一些机制可以指定特定的 CPU 来处理您的任务。
在 Linux 的进程级别上,您可以使用 special commands将您的进程绑定(bind)到特定的 CPU。这将允许您创建十个线程并让操作系统在四个 CPU 上进行所有平衡。
在线程层面,可以试试Java Affinity library来自 OpenHFT。它允许在您的 Java 代码中将线程绑定(bind)到 CPU。问题是十个线程不能在没有提醒的情况下分配给四个 CPU,因此很难平衡它们。
关于java - 以负载均衡方式在 4 个线程上分配 10 个无限作业 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162994/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht