Introdução
parallel é uma extensão de simultaneidade paralela para PHP ≥ 7.2.0. A partir do parallel 1.2.0, PHP ≥ 8.0.0 é necessário.
Segue uma breve descrição dos conceitos básicos do parallel; informações mais detalhadas podem ser encontradas nesta seção do manual.
Runtime
Um parallel\Runtime representa um thread interpretador de PHP. Um parallel\Runtime é configurado com um arquivo de bootstrap opcional passado para parallel\Runtime::__construct(), normalmente é um autoloader ou alguma outra rotina de pré-carregamento: O arquivo de bootstrap irá ser incluído antes de qualquer tarefa ser executada.
Após a construção, o parallel\Runtime permanece disponível até ser fechado, eliminado ou destruído pelas regras normais de escopo dos objetos PHP. parallel\Runtime::run() permite ao programador agendar tarefas para execução em paralelo. Um parallel\Runtime possui um agendamento FIFO, as tarefas serão executadas na ordem em que foram agendadas.
API funcional
parallel implementa uma API funcional de nível superior sobre parallel\Runtime que fornece um único ponto de entrada de função para executar código paralelo com agendamento automático: parallel\run().
Task
Uma tarefa é simplesmente um Closure destinado à execução paralela. O Closure pode conter quase qualquer instrução, incluindo closures aninhados. Porém, existem algumas instruções que são proibidas nas tarefas:
-
yield
-
operador 'use' por referência
-
declaração de classe
-
declaração de função com nome
Note:
Closures aninhados podem ter 'use' por referência ou 'yield', mas não devem conter declarações de classe ou de função nomeada.
Note:
Nenhuma instrução é proibida nos arquivos que a tarefa pode incluir.
Future
parallel\Future é usado para acessar o valor de retorno da tarefa e expõe uma API para cancelamento da tarefa.
Channel
Uma tarefa pode ser agendada com argumentos, usar variáveis de escopo léxico (por valor) e retornar um valor (através de um parallel\Future), mas estes só permitem comunicação unidirecional: Eles permitem que o programador envie e recupere dados de uma tarefa, mas não permitem a comunicação bidirecional entre tarefas. A API parallel\Channel permite a comunicação bidirecional entre tarefas, um parallel\Channel é uma conexão entre tarefas semelhante a um soquete que o programador pode usar para enviar e receber dados.
Events
A API parallel\Events implementa um loop de eventos de sensação nativa (Traversable) e um método parallel\Events::poll(). Permite ao programador trabalhar com conjuntos de channels e/ou futures. O programador simplesmente adiciona channels e futures ao loop de eventos, opcionalmente definindo a entrada para gravações com parallel\Events::setInput(), e entra em um foreach: parallel irá ler e escrever em objetos à medida que eles se tornam disponíveis produzindo objetos parallel\Events\Event que descrevem as operações que ocorreram.