netlogix / dependency-resolver
1.0.0
2023-11-08 06:35 UTC
Requires
- php: ^8.1
Requires (Dev)
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";
结果