parallel
parallel
&reftitle.intro;
Розширення parallel дозволяє виконувати PHP-код в паралельних потоках.
Воно доступне в PHP ≥ 7.2.0. Для parallel ≥ 1.2.0 потрібна версія PHP ≥ 8.0.0.
Це стислий опис загального алгоритму parallel. Більше інформації є в
наступних частинах розділу.
Клас Runtime
Клас parallel\Runtime представляє потік
інтерпретатора PHP. Клас parallel\Runtime
можна налаштувати за допомогою необов'язкового файлу ініціалізації, який
потрібно передати в метод
parallel\Runtime::__construct. Зазвичай цей файл є
автозавантажувачем чи чимсь на кшталт процедури попереднього завантаження:
він буде підключатися перед виконанням кожного завдання.
Після створення, примірник parallel\Runtime
залишається доступним, допоки його не закриють чи знищать відповідно до
правил визначення області видимості об'єктів PHP. Метод
parallel\Runtime::run дозволяє програмісту
планувати запуски паралельних завдань. Клас
parallel\Runtime послуговується принципом FIFO
(перший прийшов — перший вийшов), тобто завдання виконуються в тій
послідовності, у якій вони були заплановані.
Функціональний API
parallel реалізує функціональний API вищого рівня поверх
parallel\Runtime, надаючи єдину функціональну точку
входу для паралельного виконання коду з автоматичним плануванням — функцію
parallel\run.
Завдання
Завдання — це просте замикання (Closure), яке
потрібно буде виконати паралельно. Замикання
(Closure) може містити більшість інструкцій, навіть
вкладені замикання. Проте є інструкції, заборонені в завданнях:
yield
посилання
оголошення класу
оголошення функції з назвою
Вкладеним замиканням дозволяється містити інструкції yield або посилання,
але не оголошення класів чи функцій з назвами.
Скрипти, що підключені в завданнях, жодних обмежень не мають.
Ф'ючерс
Клас parallel\Future використовується для доступу до
значень, що повертає завдання, і надає API для скасування завдання.
Канал
Завдання можна можна додати в чергу, вказати йому параметри, використовувати
змінні лексичної області (тобто за значенням), та отримати результат
виконання (через клас parallel\Future), таким чином
встановивши однонаправлений зв'язок, дозволяючи програмісту передати дані
в завдання, а потім отримати від нього відповідь. Для двонаправленого
зв'язку між завданнями використовується API
parallel\Channel, який утворює сокет-подібний зв'язок
між завданнями, який програміст може використовувати для надсилання та
отримання даних.
Події
API parallel\Events реалізує власний цикл подій
(Traversable) та метод
parallel\Events::poll. Це дозволяє програмісту
працювати з набором каналів та/або ф'ючерсів. Програміст може просто додати
канали та ф'ючерси в цикл подій, за бажанням встановивши вхідні дані для
запису за допомогою методу
parallel\Events::setInput, та пройтися по подіях
в циклі foreach: розширення parallel передаватиме дані від об'єктів та в
об'єкти, коли вони стануть доступні, створюючи примірники
parallel\Events\Event, що описують операції, які
відбулися.
&reftitle.seealso;
&reference.parallel.setup;
&reference.parallel.philosophy;
&reference.parallel.functional;
&reference.parallel.parallel.runtime;
&reference.parallel.parallel.future;
&reference.parallel.parallel.channel;
&reference.parallel.parallel.events;
&reference.parallel.parallel.events.input;
&reference.parallel.parallel.events.event;
&reference.parallel.parallel.events.event.type;
&reference.parallel.parallel.sync;