Введение
parallel - это модуль параллельного выполнения для PHP 7.2+.
Краткое описание основных понятий параллельных процессов описано ниже, более подробную информацию можно найти в этом разделе руководства.
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
-
use by-reference
-
declare class
-
declare named function
Замечание:
Вложенные замыкания могут содержать "yield" или "use by-reference", но не должны содержать объявления классов или именованных функций.
Замечание:
Никакие инструкции не запрещены в файлах, которые может включать задача.
Фьючерс
parallel\Future используется для доступа к возвращаемому значению из задачи и предоставляет API для отмены задачи.
Канал
Задачу можно запланировать с аргументами, использовать переменные лексической области видимости (по значению) и вернуть значение (с помощью parallel\Future), но это разрешает только однонаправленную связь: Это позволяет программисту отправлять данные и извлекать данные из задачи, но не допускают двунаправленную связь между задачами. API parallel\Channel обеспечивает двунаправленную связь между задачами, parallel\Channel - это соединение типа сокета между задачами, которое программист может использовать для отправки и получения данных.
События
API parallel\Events реализует собственный цикл событий (Traversable) и метод parallel\Events::poll(). Это позволяет программисту работать с наборами каналов и/или фьючерсами. Программист просто добавляет каналы и фьючерсы в цикл событий, необязательно устанавливая вход для записи с помощью parallel\Events::setInput(), и входит в foreach: parallel будет читать и записывать объекты по мере их превращения. Доступно с получением объектов parallel\Events\Event, описывающих произошедшие операции.