MikeRoetgers/dependency-graph

0.4.0 2014-07-28 17:26 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:37:14 UTC


README

Build Status

这是一个依赖图的简单实现(有向无环图)。定义不同操作之间的操作和依赖关系。依赖管理器会跟踪所有依赖,并告诉您哪些操作可以执行。这对于处理长时间运行的任务并希望识别可能并行运行的操作特别方便。

示例

$op1 = new GenericOperation(1);
$op2 = new GenericOperation(2);
$op3 = new GenericOperation(3);
$op4 = new GenericOperation(4);

$dm = new DependencyManager();
$dm->addOperation($op1)->addOperation($op2)->addOperation($op3)->addOperation($op4);

$dm->addDependencyByOperation($op1, $op2);
$dm->addDependencyByOperation($op1, $op3);
$dm->addDependencyByOperation($op2, $op4);
$dm->addDependencyByOperation($op3, $op4);

此定义结果生成以下图

      1
    /  \
   2    3
    \  /
     4

询问依赖管理器哪些操作可以执行。当一个操作完成时,通知依赖管理器并询问新的可用操作。

$operations = $dm->getExecutableOperations(); // 1
$dm->markAsExecuted($op1);
$operations = $dm->getExecutableOperations(); // 2 and 3
$dm->markAsExecuted($op3);
$operations = $dm->getExecutableOperations(); // 2
$dm->markAsExecuted($op2);
$operations = $dm->getExecutableOperations(); // 4

更复杂的图也是可能的。

  1     2
  |    / \
  3   4   5
   \ /    |
    6     7
    |
    8

无环性

该图是无环的,这意味着以下情况是不允许的

$op1 = new GenericOperation(1);
$op2 = new GenericOperation(2);
$op3 = new GenericOperation(3);

$dm = new DependencyManager();
$dm->addOperation($op1)->addOperation($op2)->addOperation($op3);

$dm->addDependencyByOperation($op1, $op2);
$dm->addDependencyByOperation($op2, $op3);
$dm->addDependencyByOperation($op3, $op1);
   1
  / \
 2 – 3

在初始化图时会检测到循环。将抛出 CycleException。

使用标签

您可以为操作分配一个或多个标签。之后,您可以使用标签来定义依赖关系。

$setupOperation1 = new GenericOperation('Setup1');
$setupOperation1->addTag('setup');
$setupOperation2 = new GenericOperation('Setup2');
$setupOperation2->addTag('setup');

$downstreamOperation = new GenericOperation('Downstream');

$dm = new DependencyManager();
$dm->addOperation($setupOperation1)->addOperation($setupOperation2)->addOperation($downstreamOperation);

$dm->addDependencyByTag('setup', $downstreamOperation); // execute all setup operations first
 Setup1    Setup2
    \       /
     \     /
      \   /
       \ /
    Downstream

当然,反过来也是可能的

$dm->addDependencyByTag($downstreamOperation, 'setup'); // downstream is a dependency for all operations tagged with "setup"
    Downstream
       / \
      /   \
     /     \
    /       \
 Setup1    Setup2