|
| 1 | +# Parallel Executor |
| 2 | + |
| 3 | +Простой класс на PHP 7.2+, позволяющий выполнять задачи в нескольких отдельных параллельных потоках PHP при помощи расширения [parallel](https://www.php.net/manual/ru/book.parallel.php). |
| 4 | + |
| 5 | +## Содержание |
| 6 | +<!-- MarkdownTOC levels="1,2,3,4,5,6" autoanchor="true" autolink="true" --> |
| 7 | + |
| 8 | +- [Требования](#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) |
| 9 | +- [Установка](#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0) |
| 10 | +- [Класс `\App\ParallelExecutor`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-appparallelexecutor) |
| 11 | + - [Методы класса](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0) |
| 12 | + - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B) |
| 13 | +- [Примеры](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B) |
| 14 | +- [Автор](#%D0%90%D0%B2%D1%82%D0%BE%D1%80) |
| 15 | +- [Лицензия](#%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F) |
| 16 | + |
| 17 | +<!-- /MarkdownTOC --> |
| 18 | + |
| 19 | +<a id="%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></a> |
| 20 | +## Требования |
| 21 | + |
| 22 | +- PHP >=7.2 Thread Safe. |
| 23 | +- PHP-расширение [parallel](https://www.php.net/manual/ru/book.parallel.php). |
| 24 | +- Произвольный автозагрузчик классов, реализующий стандарт [PSR-4](https://www.php-fig.org/psr/psr-4/). |
| 25 | + |
| 26 | +<a id="%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0"></a> |
| 27 | +## Установка |
| 28 | + |
| 29 | +Установка через composer: |
| 30 | +``` |
| 31 | +$ composer require andrey-tech/parallel-executor:"^1.0" |
| 32 | +``` |
| 33 | +или добавить |
| 34 | +``` |
| 35 | +"andrey-tech/parallel-executor": "^1.0" |
| 36 | +``` |
| 37 | +в секцию require файла composer.json. |
| 38 | + |
| 39 | +<a id="%D0%9A%D0%BB%D0%B0%D1%81%D1%81-appparallelexecutor"></a> |
| 40 | +## Класс `\App\ParallelExecutor` |
| 41 | + |
| 42 | +<a id="%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0"></a> |
| 43 | +### Методы класса |
| 44 | + |
| 45 | +- `__construct(int $threads = 5, string $channelName = __CLASS__, int $channelСapacity = Channel::Infinite)` |
| 46 | + Конструктор класса. |
| 47 | + * `$threads` - количество создаваемых сред исполнения, как отдельных потоков PHP; |
| 48 | + * `$channelName` - имя создаваемого именованного канала; |
| 49 | + * `$channelСapacity` - емкость создаваемого именованного канала, МиБ (0 - небуферизированный канал) |
| 50 | +- `execute(\Closure $closure, array $argv = []) :void` |
| 51 | + Отправляет на исполнение переданную задачу. |
| 52 | + * `$closure` - функция-замыкание, исполняющяя задачу; |
| 53 | + * `$argv` - аргументы функции. |
| 54 | + |
| 55 | +<a id="%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B"></a> |
| 56 | +### Дополнительные параметры |
| 57 | + |
| 58 | +Дополнительные параметры устанавливаются через публичные статические свойства класса `\App\ParallelExecutor`: |
| 59 | + |
| 60 | +Свойство | По умолчанию | Описание |
| 61 | +----------------------- | ------------------ | -------- |
| 62 | +`$autoloader` | '' | Устанавливает файл автозагрузчика классов, подключаемый в каждой среде исполнения |
| 63 | + |
| 64 | +<a id="%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B"></a> |
| 65 | +## Примеры |
| 66 | + |
| 67 | +Выполнение 10 задач в 3 параллельных потоках PHP: |
| 68 | +```php |
| 69 | +/* |
| 70 | + * Создаем исполнитель c 3-я отдельными параллельными потоками PHP |
| 71 | + * и буферизированным каналом с именем по умолчанию '\App\ParallelExecutor' |
| 72 | + */ |
| 73 | +$executor = new \App\ParallelExecutor(3); |
| 74 | + |
| 75 | +$i = 0; |
| 76 | +$startTime = microtime(true); |
| 77 | +while ($i < 10) { |
| 78 | + $i++; |
| 79 | + $executor->execute( |
| 80 | + function ($i, $startTime) { |
| 81 | + $sleep = random_int(1, 5); |
| 82 | + printf("[%.4f] %2d: Start sleeping {$sleep} s..." . PHP_EOL, microtime(true) - $startTime, $i); |
| 83 | + sleep($sleep); |
| 84 | + printf("[%.4f] %2d: DONE" . PHP_EOL, microtime(true) - $startTime, $i); |
| 85 | + }, |
| 86 | + [ $i, $startTime ] |
| 87 | + ); |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +Результат: |
| 92 | +``` |
| 93 | +[0.0002] 1: Start sleeping 4 s... |
| 94 | +[0.0002] 3: Start sleeping 1 s... |
| 95 | +[0.0002] 2: Start sleeping 1 s... |
| 96 | +[1.0015] 2: DONE |
| 97 | +[1.0015] 3: DONE |
| 98 | +[1.0019] 4: Start sleeping 1 s... |
| 99 | +[1.0061] 5: Start sleeping 3 s... |
| 100 | +[2.0069] 4: DONE |
| 101 | +[2.0073] 6: Start sleeping 5 s... |
| 102 | +[4.0011] 1: DONE |
| 103 | +[4.0014] 7: Start sleeping 4 s... |
| 104 | +[4.0073] 5: DONE |
| 105 | +[4.0077] 8: Start sleeping 2 s... |
| 106 | +[6.0084] 8: DONE |
| 107 | +[6.0088] 9: Start sleeping 2 s... |
| 108 | +[7.0118] 6: DONE |
| 109 | +[7.0121] 10: Start sleeping 1 s... |
| 110 | +[8.0066] 7: DONE |
| 111 | +[8.0136] 9: DONE |
| 112 | +[8.0166] 10: DONE |
| 113 | +``` |
| 114 | + |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | + |
| 119 | +<a id="%D0%90%D0%B2%D1%82%D0%BE%D1%80"></a> |
| 120 | +## Автор |
| 121 | +© 2020 andrey-tech |
| 122 | + |
| 123 | +<a id="%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F"></a> |
| 124 | +## Лицензия |
| 125 | +Данный код распространяется на условиях лицензии [MIT](./LICENSE). |
0 commit comments