andrey-tech / parallel-executor-php
PHP 7.2+ 的简单类,通过 PHP 扩展 parallel 允许多个并行执行任务
1.0.0
2020-06-30 09:38 UTC
Requires
- php: >=7.0
This package is auto-updated.
Last update: 2024-09-06 20:55:12 UTC
README
PHP 7.2+ 的简单类,通过 PHP 扩展 parallel 允许多个并行执行任务。
Docker 镜像,用于快速检查示例,可在 Docker Hub 的仓库中找到。
内容
要求
安装
通过 composer 安装
$ composer require andrey-tech/parallel-executor:"^1.0"
或添加到 composer.json 文件的 require 部分:
"andrey-tech/parallel-executor": "^1.0"
类 \App\ParallelExecutor
类方法
__construct(int $threads = 5, string $channelName = __CLASS__, int $channelCapacity = Channel::Infinite)
类构造函数。$threads
- 创建的执行器数量,作为独立的 PHP 流程;$channelName
- 创建的命名通道的名称;$channelCapacity
- 创建的命名通道的容量,MiB(0 - 无缓冲的通道)
execute(\Closure $closure, array $argv = []) :void
发送任务执行。$closure
- 执行任务的函数;$argv
- 函数的参数。
附加参数
通过类 \App\ParallelExecutor
的公共静态属性设置附加参数
示例
使用带缓冲的通道在 3 个并行 PHP 流程中执行 10 个任务
// Создаем исполнитель c 3-я отдельными параллельными потоками PHP и буферизированным каналом $executor = new \App\ParallelExecutor(3); $i = 0; $startTime = microtime(true); while ($i < 10) { $i++; printf("[%.4f] execute" . PHP_EOL, microtime(true) - $startTime, $i); $executor->execute( function ($i) use ($startTime) { $sleep = random_int(1, 5); printf("[%.4f] %2d: Start sleeping {$sleep} s..." . PHP_EOL, microtime(true) - $startTime, $i); sleep($sleep); printf("[%.4f] %2d: DONE" . PHP_EOL, microtime(true) - $startTime, $i); }, [ $i ] ); }
结果
[0.0000] execute
[0.0001] execute
[0.0002] execute
[0.0002] 1: Start sleeping 5 s...
[0.0002] execute
[0.0003] 2: Start sleeping 4 s...
[0.0003] execute
[0.0003] 3: Start sleeping 5 s...
[0.0003] execute
[0.0004] execute
[0.0004] execute
[0.0004] execute
[0.0005] execute
[4.0008] 2: DONE
[4.0010] 4: Start sleeping 4 s...
[5.0005] 3: DONE
[5.0005] 1: DONE
[5.0007] 5: Start sleeping 5 s...
[5.0008] 6: Start sleeping 1 s...
[6.0020] 6: DONE
[6.0022] 7: Start sleeping 4 s...
[8.0016] 4: DONE
[8.0018] 8: Start sleeping 1 s...
[9.0023] 8: DONE
[9.0025] 9: Start sleeping 5 s...
[10.0014] 5: DONE
[10.0015] 10: Start sleeping 2 s...
[10.0026] 7: DONE
[12.0017] 10: DONE
[14.0036] 9: DONE
使用不带缓冲的通道在 3 个并行 PHP 流程中执行 10 个任务
// Создаем исполнитель c 3-я отдельными параллельными потоками PHP и НЕ буферизированным каналом $executor = new \App\ParallelExecutor(3, 'taskChannel', 0); $i = 0; $startTime = microtime(true); while ($i < 10) { $i++; printf("[%.4f] execute" . PHP_EOL, microtime(true) - $startTime, $i); $executor->execute( function ($i) use ($startTime) { $sleep = random_int(1, 5); printf("[%.4f] %2d: Start sleeping {$sleep} s..." . PHP_EOL, microtime(true) - $startTime, $i); sleep($sleep); printf("[%.4f] %2d: DONE" . PHP_EOL, microtime(true) - $startTime, $i); }, [ $i ] ); }
结果
[0.0000] execute
[0.0002] 1: Start sleeping 2 s...
[0.0002] execute
[0.0003] 2: Start sleeping 3 s...
[0.0004] execute
[0.0005] 3: Start sleeping 4 s...
[0.0005] execute
[2.0008] 1: DONE
[2.0009] 4: Start sleeping 5 s...
[2.0010] execute
[3.0006] 2: DONE
[3.0007] 5: Start sleeping 2 s...
[3.0007] execute
[4.0007] 3: DONE
[4.0009] 6: Start sleeping 3 s...
[4.0010] execute
[5.0012] 5: DONE
[5.0013] 7: Start sleeping 5 s...
[5.0014] execute
[7.0013] 4: DONE
[7.0013] 6: DONE
[7.0015] 8: Start sleeping 5 s...
[7.0015] execute
[7.0018] 9: Start sleeping 1 s...
[7.0018] execute
[8.0020] 9: DONE
[8.0022] 10: Start sleeping 4 s...
[10.0017] 7: DONE
[12.0025] 10: DONE
[12.0025] 8: DONE
作者
© 2020 andrey-tech
许可证
此代码根据 MIT 许可证分发。