1

我正在处理一棵树,并希望使用 GPAR 加速它。我将它用于简单的事情,但没有深入研究更复杂的选项。

假设我正在用自己的线程处理树的不同分支。

假设一个节点有一个名字。当我第一次点击该节点时,我希望它被处理(包括将内容写入数据库等),并添加到缓存中(这里只是一个简单的地图)。

我希望其他线程可能会在树上的其他地方碰到同一个节点(例如同名的节点),以检查缓存。如果它已经在缓存中,他们可以抓住它并继续前进。如果另一个线程第一次处理该节点,我希望其分支中该节点上的其他线程在继续向下树之前等待(对于依赖于该节点的其他事物已经被处理)。

该节点是从数据库中提取的,因此每个分支中的对象都不相同,我认为同步方法不会起作用。

我当然希望其他不相关的节点继续处理。

例如:

  • 线程 1 正在处理 ABCD
  • 线程 2 正在处理 EBFG
  • 线程 3 正在处理 WXY
  • 线程 4 正在处理 LMNOPQRSBJ

假设线程 1 首先到达节点 B。它发现它不在缓存中,所以它开始处理它。

线程 2 出现并看到节点 B 不在缓存中,但它正在处理中。所以它等待继续到节点 F,直到线程 1 完成处理节点 B。

线程 3 不关心节点 B,因此继续运行。

线程 4 在线程 1 处理完节点 B 并在缓存中找到节点 B 之后出现,因此它只是将其从缓存中拉出并继续到节点 J。

我正在寻找有关如何最好地将 GPAR 应用于这种情况的建议。

谢谢!

4

1 回答 1

2

我的第一个想法是使用共享的 ConcurrentHashmap,其中节点名称作为键,DataflowVariables 作为值。

线程使用 putIfAbsent(nodename, new DataflowVariable()) 自动插入已处理节点数据的承诺,如果操作成功,线程可能开始处理节点并最终将结果绑定到 DataflowVariable。

如果 putIfAbsent() 失败,则其他一些线程已经开始处理同名节点。在这种情况下,当前线程可能只获取与节点名称关联的 DataflowVarieble 并等待结果可用 - 调用 get() 或 whenBound()。

于 2012-11-09T04:55:39.710 回答