mehr-als-nix / parallel
此包是 PhpDumentor/Parallel 的移植版
Requires (Dev)
- phpunit/phpunit: ^6.5
This package is auto-updated.
Last update: 2024-08-29 03:26:19 UTC
README
这是一个库,用于将并行化引入到您的项目中。请查看 example.php
文件以了解如何使用此库的示例。
工作原理
此库将使开发人员能够并行执行指定数量的任务(工作者)。这是通过将工作者添加到管理器中,可选地定义同时运行的进程数,然后执行管理器来实现的。
在 Linux 上,此库将尝试检测处理器数量,并允许最大进程数等于处理器数量。如果无法确定或用户正在运行 Windows,则使用默认值 2。
需求和优雅降级
并行化有几个要求。但是,为了允许分发,如果未满足要求,则此库将按顺序执行给定任务。如果未满足要求,将抛出 E_USER_NOTICE php 错误,解释用户缺失依赖项。
此库的要求是
- 兼容 *NIX 的操作系统
- 脚本不得从 Apache 模块中运行
- PCNTL PHP 扩展(https://php.ac.cn/manual/en/book.pcntl.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