jjzjj

java - 以负载均衡方式在 4 个线程上分配 10 个无限作业 (Java)

coder 2024-03-28 原文

我有 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/

有关java - 以负载均衡方式在 4 个线程上分配 10 个无限作业 (Java)的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在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

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用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

  3. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.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

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  7. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用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

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐