问题标签 [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 投票
1 回答
355 浏览

java - 关于 fork-join 框架

作为其中的方法fork();compute()为什么每次方法compute()发生时都不会被称为另一个并行度?也许有一个布尔标志? 编辑:

覆盖compute()类 RecursiveTask 的方法:(伪代码)

所以基本上这是compute()递归调用的方法,当fork()发生时,它可以使用并行性并使用另一个核心处理该任务。但是,在递归fork()调用该方法的所有时间都应该调用递归。所以在现实中它不会发生(没有意义)。是不是因为一个布尔标志表明 fork 已经被激活?

提前致谢。

0 投票
1 回答
237 浏览

concurrency - Java fork 加入问题

我正在学习java中的fork-join技术并编写了以下程序。我正在运行一个 for 循环(5 次),我想在单独的线程中运行 for 循环的内容。这是正确发生的。问题是,当所有线程都完成后,我想要一个大小为 5 的向量,它必须包含在索引 0 处执行线程 1 的结果,在索引 1 处执行线程 2 的结果...... .... 在索引 4 处执行线程 5 的结果。我清楚地看到了我想要实现的目标,但不知道它的语法。

目前我的向量中只有 1 个数字。

0 投票
3 回答
4241 浏览

java - 在 invokeAll/join 期间 ForkJoinPool 停止

我尝试使用ForkJoinPool 来并行化我的 CPU 密集型计算。我对 ForkJoinPool 的理解是,只要可以执行任何任务,它就会继续工作。不幸的是,我经常观察到工作线程空闲/等待,因此并非所有 CPU 都保持忙碌。有时我什至观察到额外的工作线程。

我没想到会这样,因为我严格尝试使用非阻塞任务。我的观察与 ForkJoinPool 的观察非常相似,似乎浪费了一个线程。在对 ForkJoinPool 进行大量调试后,我有一个猜测:

我使用 invokeAll() 在子任务列表上分配工作。在 invokeAll() 完成执行第一个任务本身之后,它开始加入其他任务。这工作正常,直到下一个要加入的任务位于执行队列的顶部。不幸的是,我在没有加入的情况下异步提交了其他任务。我希望 ForkJoin 框架首先继续执行这些任务,然后再返回加入任何剩余的任务。

但它似乎不是这样工作的。相反,工作线程停止调用 wait(),直到等待的任务准备好(可能由另一个工作线程执行)。我没有验证这一点,但这似乎是调用 join() 的一般缺陷。

ForkJoinPool 提供了一个asyncMode,但这是一个全局参数,不能用于单个提交。但我喜欢看到我的异步分叉任务很快就会被执行。

那么,为什么 ForkJoinTask.doJoin() 不简单地在其队列顶部执行任何可用任务,直到它准备好(自己执行或被其他人窃取)?

0 投票
2 回答
4343 浏览

java - invokeAll 它究竟是如何工作的?(ForkJoin)

我写了以下代码段:

我看到它会自动分叉我传递给invokeAll()的两个对象之一。RecursiveActionTry我的笔记本电脑只有 2 个核心。如果我有 4 个核心并启动 4 个任务……invokeAll(right, left, backward, forward);我会使用所有 4 个核心吗?无法知道,因为我只有 2 个核心。

我还想知道在幕后调用compute()第一个参数(右)和fork + join第二个参数(左)是否调用所有(右,左)。(就像在 RecursiveTask 扩展中应该那样)。否则它不会使用并行性,不是吗?顺便说一句,如果有超过 2 个参数.. 它会调用compute()第一个参数并分叉所有其他参数吗?

提前致谢。

0 投票
1 回答
175 浏览

c# - 是否有与 C# 分区器等效的 Java

在我当前的项目中,我试图在 Java 中复制以下功能,但我不确定这部分代码到底在做什么。

根据我对评论的分析,我认为当消息数大于 10 时,代码使用 C# 的 Partitioner 函数创建多个线程,其中接收到的消息数在线程之间“平均”分配。

此外,在此方法的后面部分中,注释引用了从 RecieveTask 接收到的消息,这些消息存储在红黑树中。RecieveTask 方法的评估没有揭示这种排序的任何实现,这引出了 Partitioner 是否也这样做的问题。

有人可以确认或更正我对 C# Partitioner 功能的理解,并给我一些关于如何在 Java 中完成此任务的想法吗?我对 Java 并发库的经验是有限的,我没有看到这样的选项可用。

编辑1:

我找到了排序的来源,RecieveTask 将消息添加到 SortedSet。

编辑2:

似乎分区器只是将任务分成组,但创建多个线程的是 Parallel 函数。

如果我按照评论中的建议调用 Java 的 ForkJoinPool,这种分区会自动发生,还是我需要自己划分工作?

如果我必须划分工作量,我将如何调用具有可变消息范围的 FutureTask 的多个实例?

0 投票
1 回答
339 浏览

java - 如何在 Java 中设置 Fork/Join 算法的阈值?

如何确定 Fork/Join 算法的适当阈值?现在我随意玩一些阈值并检查结果。但是是否有任何指南或最佳实践如何设置最合适的阈值?

在我的示例中,我使用了一个包含 1_000_000 个元素的数组。

将我的阈值 von 100_000 更改为:

给我更多的表现。但这只是任意测试。

有人可以帮我吗?:)

0 投票
2 回答
1753 浏览

parallel-processing - Java 7 在文件夹中递归地并行搜索文件

我想使用 Java 7 中的 Visitor API 在文件夹中递归搜索一些文件。由于我将搜索包含 100.000 多个文件的大文件夹,这些文件在文件夹中稀疏,因此我想并行执行此操作。

但是,例如,我不能为每个文件夹生成一个线程。May Fork Join 可能是一个想法,但据我了解,FJ 通常在您知道数据时使用,例如,您有一个给定的数组并且您想处理其中的 5 个元素的一部分。所以在这种情况下可以很好地使用分而治之。

因此,您能否分享您对一个想法的看法,该想法可以让我快速递归搜索文件(必须是并行的),并且如果用户愿意,也可以取消。

谢谢你,琉

0 投票
1 回答
207 浏览

parallel-processing - Map Reduce 或其他分布式/并行设计模式?

我有这个代码可以连接/组合一组图像。我想将此顺序代码重组为并行/分布式应用程序,因为我的图像集合非常大(大数据:-))。我正在考虑使用 Map/Reduce,但不确定这在 Map/Reduce 下是否可行。

注意:顺序无所谓;组合图像 1,2,3,4,5 与组合图像 2,3,1,4,5 一样好。

理想情况下,我想要这样的东西(看起来更像是一个经典的 divide-et-impera 而不是 map/reduce ):

在此处输入图像描述

1,2,3,4 是原始图像。一个节点将图像#1 和图像#2 连接成一个称为图像#5 的新图像。第二个节点将图像#3 和图像#4 连接成图像#6,最后一个节点将图像#5 和图像#6 连接成最终结果。

关于我应该使用什么框架/并行或分布式设计模式来做这样的事情有什么想法吗?

干杯!!

0 投票
1 回答
607 浏览

java - fork() 最终会调用计算吗?

我的理解是它创建了另一个线程并在另一个线程中运行 compute()。然后加入递归地获取结果。

我想知道是否fork()打电话compute()。提前致谢。

0 投票
1 回答
118 浏览

java - 它们对 asyncMode 意味着什么?

直接来自这个javadoc

此类为 Runnable 和 Callable 提供了适应方法,当将 ForkJoinTasks 的执行与其他类型的任务混合执行时可能会用到这些方法。当所有任务都是这种形式时,考虑使用在 asyncMode 中构造的池。

asyncMode在这种情况下,它实际上意味着什么?我怎样才能建造一个游泳池asyncMode