问题标签 [fork-join]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
215 浏览

mule - 如何处理在 mule 中使用请求回复路由器的异常

我在我的流程中使用以下分叉和连接模式。并行处理工作得很好。但是,我有异常处理的问题。我想为路由器的 VM 响应入站端点上发生的处理实施异常策略。但是,当我尝试从捕获异常策略块中写入响应时,似乎什么也没发生。当出现异常时,我可以从 catch 块中看到日志语句,但浏览器上的响应只是挂起。请建议。

0 投票
4 回答
2021 浏览

java - 如何确定一个fork-join任务合适的分工阈值

在查看Fork/Join Tutorial之后,我创建了一个用于计算大阶乘的类:

我的问题是如何确定我细分任务的阈值?我发现了一个关于 fork/join parallelism 的页面,其中指出:

使用 fork/join 并行实现算法时要考虑的主要事项之一是选择阈值,该阈值确定任务是否将执行顺序计算而不是分叉并行子任务。

如果阈值太大,则程序可能无法创建足够的任务来充分利用可用的处理器/内核。

如果阈值太小,则任务创建和管理的开销可能会变得很大。

通常,需要进行一些实验来找到合适的阈值。

那么我需要做哪些实验来确定阈值呢?

0 投票
1 回答
161 浏览

groovy - 分叉/连接计算

我有这个 fork/join 计算的例子。有人可以简短地描述一下它是如何在这里工作的吗?

0 投票
1 回答
100 浏览

java - Using ForkJoin to search a string in cube (3D-dimension) is a good choice?

I'm doing with parallel programming project. The requirement is to search a list of string in a lattice of cube (3D-dimension and maximum is 1000 elements). The max size of list is 1000 and the max length of string is 100.

I create 3 ForkTask: search in X-Dimension(NxN 2D-array), in Y-Dimension(NxN 2D-array), in Z-Dimension(NxN 2D-array). For each Task, I start searching the string in 2D-array and I create a ForkTask for this. I had a function to search a string in 2D-array.

I see that I have a lot of ForkTask as well as thread. To improve the search performance and time reduction, I check that if a task.join() is true, I will cancel the rest of tasks.

Is it a wise approach? Anyone can give me any recommendation or suggestion or advice?

Thanks

0 投票
3 回答
5285 浏览

java - 分析:ForkJoinPool 的性能

问题

由于 Fork-Join 似乎是当前的炒作并在许多答案中被推荐,我想:为什么不研究一下它的实际速度呢?

为了测量这一点,我编写了一个小程序(见下面的代码),它对数字进行一些加法并使用各种参数将其分叉出来,包括线程数、分叉深度和分叉扩展,然后测量执行时间,尤其是实际计算所花费的时间与分叉所花费的时间。

摘要答案

虽然实现得很好,但 ForkJoin 是一种非常低效的并行任务方式,因为每个 fork 的成本非常高。一个简单的问题优化实现可以轻松存档 99% 的线程执行时间(这超过了使用 Fork-Join 测量的所有内容),因此这样的实现总是比 Fork-Join 实现更快。此外,如果每个 fork 的实际任务很小,则 Fork-Join 实现甚至比单线程线性实现要慢得多。

所以 Fork-Join 更多的是一个关于它是否有助于代码架构的问题,因为它与其他实现相比没有任何性能优势。因此,只有在以下情况下才应使用 Fork-Join:

  • 性能并不重要,任务经常需要等待其他任务的结果才能继续。所以基本上如果 Fork-Join 结构大大简化了简单实现的任务。

  • 实际任务大大超过了分叉的成本,因此损失可以忽略不计。在我的测试中,添加 2 个值的循环必须在每个 fork 中循环至少 10000 次才能获得合理的性能。

编辑:请参阅此处了解我所指出的更深入的分析。

测试设置

在我的程序中,我有一个 RecursiveTask 计算给定 N 的斐波那契数列,这将实际计算减少到 3 个作业和 1 个加法。对于任何给定的 CPU,这应该是一项次要任务。

在测试中,我改变了线程数量、每个任务的分叉数量和斐波那契循环的长度。此外,我用 async 参数做了一些测试,但是将这个设置为 false 只显示计算时间略有减少,所以我跳过了。传播参数(每个叉子的叉子)也大部分被跳过,因为结果没有显着差异。

一般来说,计算时间非常稳定,实际花费在任务上的时间百分比变化通常小于 1%,因此每个测试集在其他空闲系统上运行了大约 5 次(如果数字不稳定,则运行更多次)具有 4 个核心(+4 个超核心),然后选择了中值执行时间。

已通过各种测试变量验证了正确的执行,特别是已验证实际使用的线程数与最初给定的并行度参数没有差异。

详细的测试结果

在哪里:

  • Time total是从主线程的角度来看整个计算所花费的总时间。
  • Time task是实际计算所有叉子组合中的斐波那契数列所花费的时间。
  • Time task percentage是线程的相对增益(时间任务/时间总和)。
  • spread->depth是(设置)传播(每个叉子的叉子)和(计算的)分叉深度。
  • threads是实际使用的线程数。
  • task-time/thread是每个线程实际花费在总体上计算斐波那契数列的时间。

传播->深度测试:

结论:分叉的数量只有很小的影响(更少的分叉=更好),实现似乎相当复杂。使用其他设置收集了类似的结果,所以我在这里跳过这些。

Fib(0)(几乎所有时间都花在分叉上)

结论:对于一个非常小的任务,大部分时间都花在了 fork 上,这使得单线程实现比任何 Fork-Join 设置快约 5 倍。即使有多个线程,使用 Fork-Join 也不可能获得任何性能提升。

纤维(100)

结论:似乎已经接近单线程执行的盈亏平衡点,而多线程开始产生影响。单线程实现仍然比任何 Fork-Join 设置都快。

纤维(1000)

结论:多线程执行的时间开始趋于稳定,几乎线性增益,而每个线程仍有约 20% 的计算时间用于分叉。虽然此时分叉可以通过线程提高性能,但幼稚的实现仍然会明显更快。

纤维(10000)

结论:在这个数字上,计算超过了分叉的成本。虽然幼稚的实现仍然会稍微快一些,但如果任务以另一种方式实现起来要困难得多,那么分叉造成的损失可以忽略不计。

代码

随时指出任何错误或提出改进建议。对于一些奖励积分,我将接受最有价值的答案。

0 投票
4 回答
2809 浏览

java - JavaEE 应用程序的分叉/加入?

我知道在 JavaEE 应用程序中分离线程是一个很大的禁忌。但是,我有一个应用程序非常适合Java 的 fork/join 机制。但是,由于不应该在应用程序中创建线程,有没有办法在我的 EJB 中使用它?我知道在 WebSphere 应用程序上,异步 bean 功能提供了这一点。但是,我的应用程序部署在 JBoss EAP 6.1 上,所以这不是一个选项。

在 JavaEE 应用程序中是否有“合法”的方式来完成 fork/join?

0 投票
0 回答
1150 浏览

java - 使用 java F/J 框架进行简单合并排序.....Correclty

我将其作为一个问题发布,因为我想与你们澄清在 Java 1.7 中使用 F/J 框架的概念,因为我看到互联网上的一些示例似乎没有意义。

使用列表而不是数组的代码是有意的。

这是递归合并排序的线性/常规版本。

这是扩展递归任务的合并排序的 F/J 版本。

这是调用它们的主程序。

我在网上考虑的问题是,大多数示例中的分叉是将分割任务的两条腿分叉在一起,或者先分叉左边的分叉部分,然后再分叉右边。

在合并排序中使用 F/J 的情况下,我认为这应该是一个很大的禁忌。

归并排序实际上是从左到右的线性相关排序。先左分叉不会产生任何已经存在的并行进程。F/J 框架将所有你的 fork() 按提交顺序放入队列中,然后由 F/J 池的每个工作线程分别按提交顺序提取和执行。

但是,首先正确分叉将为您提供稍后应该执行的并行计算的优势(与原始/线性实现相比)提前并首先进行尾部的划分/合并。

让我知道你们的想法。并希望这将是使用 F/J 进行排序的一个很好的例子。

0 投票
1 回答
741 浏览

groovy - 从 gpars 并行执行器异步收集结果

我们有一些使用 ThreadPoolExecutor 和 CompletionService 的 Java 代码。任务大批量提交到池中;结果转到完成服务,我们在可用时收集已完成的任务,而无需等待整个批次完成:

池中的工人总数为 MAX_NUMBER_OF_WORKERS;在没有可用工作人员的情况下提交的任务排队;最多可以排队 20 个任务,之后,任务被拒绝。

这种方法的Gpars对应物是什么?

阅读有关 gpars 并行性的文档collectManyParallel(),我发现了许多潜在的选项: 、anyParallel()fork/join等,我什至不确定要测试哪些选项。我希望在文档中找到一些提及“完成”或“完成服务”的内容作为比较,但一无所获。我正在寻找一些关于从那些有 gpars 经验的人那里开始的方向/指针。

0 投票
6 回答
43632 浏览

java - Java 的 Fork/Join vs ExecutorService - 什么时候使用?

我刚刚读完这篇文章:Java-5 ThreadPoolExecutor 与 Java-7 ForkJoinPool 相比有什么优势?并且觉得答案不够直截了当。

你能用简单的语言和例子解释一下,Java 7 的 Fork-Join 框架和旧的解决方案之间有什么权衡吗?

我还阅读了谷歌关于Java Tip: When to use ForkJoinPool vs ExecutorService from javaworld.com的 #1 热门文章,但这篇文章没有回答标题问题when,它主要谈论 api 差异......

0 投票
1 回答
1993 浏览

java - 为什么这个简单的 java fork join pool 不起作用?

我即将测试这个 forkjoin 池,但它不能正常工作。我想知道为什么?

这是我用来获取数组并将 3 添加到其元素的类:

这是主要课程: