我有一个包含大量活动(大约40个)的系统。每个活动要么调用一个服务,要么执行一些计算。本系统是用Java语言编写的。目前,所有这些活动都是按顺序执行的,整个过程大约需要2-3秒。我正在尝试优化系统,并尝试减少延迟。我注意到其中一些活动具有数据依赖性,并且其中一些活动是独立的。我正在尝试使这些活动并行运行,同时还维护具有数据依赖性的活动的序列。例如,假设活动'A‘到'F’按以下顺序依次执行:
A->B->C->D->E->F (Activities)
1 2 3 4 5 6 (Time Units)
假设A产生的数据由E使用,B产生的数据由F使用,其余的活动不依赖于任何其他数据。我应该能够按如下顺序并行运行这些活动,而不是按顺序运行这些活动:
A->E
B->F
C
D
1 2 (Time)
因此,系统应该能够在2个时间单位内完成整个过程,而不是6个时间单位。有没有开源的Java框架可以用来处理这样的工作流程,并且可以在数据可用时无缝地执行活动?
发布于 2016-11-08 13:25:12
这就是为此目的而设计的框架(称为Dexecutor),您可以参考this和this Dzone文章来获取此用例示例。对于像usecase这样的工作流程,请参考this。
下面是使用Dexecutor的方法。
DexecutorConfig<String, String> config = new DexecutorConfig<>(executorService, new TaskProvider());
DefaultDexecutor<String, String> executor = new DefaultDexecutor<String, String>(config);
executor.addDependency("A", "E");
executor.addDependency("B", "F");
executor.addIndependent("C");
executor.addIndependent("D");
executor.execute(ExecutionConfig.NON_TERMINATING);
免责声明:我是这个框架的所有者
发布于 2014-02-27 15:18:20
答案取决于依赖图的拓扑结构。如果它可以拆分成独立的线性序列,如您的示例所示,那么只需将每个序列表示为一个Runnable,并使用其自己的线程运行每个序列,或者将其提交到线程池。
如果一个序列像这样分支:
A->B->C
|
->D->E
然后首先运行序列ABC,然后从活动B运行DE。
最复杂的情况是一个活动依赖于两个或多个活动:
A->B -> |
C -> |->D // needs both results from B and C
您需要在图形中有一个节点来收集结果,并在收集完所有结果后启动新的序列。如果您使用线程,那么您可以将每个依赖项表示为阻塞队列,并使用BlockingQueue.take()
方法让依赖活动首先从所有输入队列读取。如果使用线程池,则可以:
CompletableFuture
类及其方法runAfterBoth
(对于2个依赖项)或allOf
(对于任意数量的连接一些数据流程库(作为作者,我建议您自己连接节点,这不是一个大问题https://stackoverflow.com/questions/22060325
复制相似问题