mehr-als-nix/parallel

此包是 PhpDumentor/Parallel 的移植版

v1.0.0 2017-12-10 12:33 UTC

This package is auto-updated.

Last update: 2024-08-29 03:26:19 UTC


README

这是一个库,用于将并行化引入到您的项目中。请查看 example.php 文件以了解如何使用此库的示例。

工作原理

此库将使开发人员能够并行执行指定数量的任务(工作者)。这是通过将工作者添加到管理器中,可选地定义同时运行的进程数,然后执行管理器来实现的。

在 Linux 上,此库将尝试检测处理器数量,并允许最大进程数等于处理器数量。如果无法确定或用户正在运行 Windows,则使用默认值 2。

需求和优雅降级

并行化有几个要求。但是,为了允许分发,如果未满足要求,则此库将按顺序执行给定任务。如果未满足要求,将抛出 E_USER_NOTICE php 错误,解释用户缺失依赖项。

此库的要求是

工作者

工作者基本上是回调函数或方法的包装器。因此,您可以使用您现有项目中的任何内容并将其并行化。

请注意,每个并行进程都是原始进程的副本。这意味着,例如,如果您传递一个对象(或其他引用)并更改它,则所做的更改不会传递给调用者。

给定回调的返回值存储在工作者的结果中,可以使用 getResult() 方法读取。

抛出的任何异常都将导致错误,其中 getReturnCode() 方法将返回异常代码(警告:这可能为 0!),而 getError() 方法将返回异常消息。

错误和异常

如果任务抛出异常,则异常将被捕获并注册为错误。异常代码用作错误号,其中消息用作错误消息。

通过使用此方法,而不是直接退出,您可以继续执行其他并行进程,并在所有进程执行完毕后自行处理错误。

示例

流畅接口

use MehrAlsNix\Parallel\Manager;
use MehrAlsNix\Parallel\Worker;

$mgr = new Manager();
$mgr
  ->addWorker(new Worker(function() { sleep(1); return 'a'; }))
  ->addWorker(new Worker(function() { sleep(1); return 'b'; }))
  ->addWorker(new Worker(function() { sleep(1); return 'c'; }))
  ->addWorker(new Worker(function() { sleep(1); return 'd'; }))
  ->addWorker(new Worker(function() { sleep(1); return 'e'; }))
  ->execute();

/** @var Worker $worker */
foreach ($mgr as $worker) {
    var_dump($worker->getResult());
}

数组接口

use MehrAlsNix\Parallel\Manager;
use MehrAlsNix\Parallel\Worker;

$mgr = new Manager();
$mgr[] = new Worker(function() { sleep(1); return 'f'; });
$mgr[] = new Worker(function() { sleep(1); return 'g'; });
$mgr[] = new Worker(function() { sleep(1); return 'h'; });
$mgr[] = new Worker(function() { sleep(1); return 'i'; });
$mgr[] = new Worker(function() { sleep(1); return 'j'; });
$mgr->execute();

/** @var Worker $worker */
foreach ($mgr as $worker) {
    var_dump($worker->getResult());
}

待办事项

  • 改进文档

  • 更智能的进程插槽;目前只有插槽集中的最老插槽被等待,但如果运行时间较长,则其他插槽将不会填充,直到第一个插槽被占用。

  • IPC(进程间通信)的最后部分,以便能够从工作者返回信息到管理器。

    • STDOUT
    • STDERR