如何为一系列任务设计执行引擎

2022-09-01 15:59:43

我试图在Java中编写一个问题,我必须执行一堆任务。

问题

执行由多个任务组成的作业,这些任务在它们之间具有依赖关系。

作业将具有任务列表,每个此类任务将进一步具有后续任务列表(每个后续任务将具有自己的后续任务 - 您可以在此处看到递归性质)。在以下情况下,每个后续任务都可以开始执行:

  1. 它被配置为在部分执行其前置任务时执行。在这种情况下,前置任务将通知它已部分完成,并且我的后续任务可以启动

  2. 成功完成其前置任务。

具有 2 个初始任务 A 和 B 的作业。A 有 2 个后续任务 M 和 N。B 有 1 个后续任务 P.P 有 2 个后续任务 Y 和 Z。

M可以在部分完成其前置任务A时启动,Z可以在部分完成其前置任务P时启动,N,P和Y只能分别在其前置任务A,B和P完成时启动。

Tasks Hierarchy (A and B can start in parallel)

我必须设计这样一个工作流程/作业的执行。在设计中,我们必须确认前置任务发送的部分完成事件,以便可以启动其后续任务。我该怎么做?是否有任何设计模式适合并发性问题?


答案 1

看看阿卡 - http://akka.io

使用 akka 创建参与者(事件驱动的异步处理消息的并发实体)

每个任务都可以表示为一个Actor(您可以选择何时启动它)

您可以在部分完成或完全完成时触发其他Actor(任务)(实际上您可以随时触发它们)


答案 2

你的问题看起来像是Java的ForkJoin框架的一个很好的用例。您可以将任务实现为 s 或 s(取决于您是否需要返回值),这将在您需要的任何条件下启动其子任务。您还可以控制子任务是按顺序运行还是并行运行。RecursiveActionRecursiveTask

例:

public class TaskA extends RecursiveAction {
  // ...

  protected void compute() {
    if (conditionForTaskM) {
      TaskM m = new TaskM();
      // Run task M asynchronously or use m.invoke() to run it synchronously.
      invokeAll(m);
    }

    // Run task N at the end of A
    invokeAll(new TaskN());
  }

}

您需要一个 ForkJoinPool 实例来运行您的任务:

public static void main(String[] args) {
  ForkJoinPool pool = new ForkJoinPool();
  pool.submit(new TaskA());

  // Properly shutdown your pool...
}

此示例在实现示例问题的一部分时非常简单。但一般来说,ForkJoin框架允许您创建树状的任务结构,其中每个父任务(例如A,B和P)都允许您控制其直接子任务的执行。


推荐