Вступ

Розширення 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, що описують операції, які відбулися.

Прогляньте також

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top