netlogix/dependency-resolver

1.0.0 2023-11-08 06:35 UTC

This package is auto-updated.

Last update: 2024-09-23 19:03:50 UTC


README

任务图求解器包是一个PHP库,它提供了一种机制来解析表示为有向无环图(DAG)的任务之间的依赖关系。

它帮助您管理和执行相互依赖的任务,并确保任务以正确的顺序执行以解决它们的依赖关系。

安装

您可以使用Composer安装此包

composer require netlogix/task-graph-solver

组件

任务

您可以使用简单的 Task 实现,或者根据 TaskInterface 创建自己的任务。

如果您想多次执行任务,可以实现 ResettableTaskInterface 并使用 reset() 方法将任务重置为其初始状态。

任务池

任务由TaskPool管理,您可以使用基本的 TaskPool 实现,或者根据 TaskPoolInterface 创建自己的TaskPool。TaskPool负责存储并为您提供定义的任务的访问权限。

任务图

TaskGraph类用于解析任务依赖关系。它接受一个TaskPool作为输入,并且可以迭代以获取正确解析顺序的任务,考虑其依赖关系。它还检查循环依赖关系并防止无限循环。

使用方法

use Netlogix\DependencyResolver\TaskGraph;

$taskGraph = new TaskGraph($taskPool);

foreach ($taskGraph as $resolutionBatch) {
        foreach ($resolutionBatch as $task) {
        // Execute the task or do any necessary operations.
        $task->resolve();
    }
}

重置任务

如果您的TaskPool实现了ResettableTaskPoolInterface,您可以使用TaskGraph的resetPool()方法重置所有任务到其初始状态以重新执行。

$taskGraph->resetPool();

示例

以下是一个简单的示例,展示了如何使用TaskGraph解析任务之间的依赖关系并生成mermaid状态图。

<?php

require_once __DIR__ . '/vendor/autoload.php';

use Netlogix\DependencyResolver\Task;
use Netlogix\DependencyResolver\TaskPool;
use Netlogix\DependencyResolver\TaskGraph;

$graph = new TaskGraph(
    new TaskPool([
        new Task('TaskA'),
        new Task('TaskB', ['TaskA']),
        new Task('TaskC', ['TaskA']),
        new Task('TaskD', ['TaskB', 'TaskC']),
        new Task('TaskE'),
    ])
);

$first=true;
$lines = ['stateDiagram'];
$lastTasks = [];
foreach ($graph->getIterator() as $tasks) {
    foreach ($tasks as $name => $task) {
        $lastTasks = array_filter($lastTasks, fn($t) => !in_array($t, $task->getDependencies()));
        array_push($lines, ...$first ? ["  [*] --> $name"]
            : array_map(fn($t) => "  $t --> $name", $task->getDependencies()));
        $lastTasks[$name] = $name;
        $task->resolve();
    }
    $first=false;
}
foreach ($lastTasks as $lastTask) {
    $lines[] = "  $lastTask --> [*]";
}

echo implode("\n", $lines) . "\n";

结果