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