Como existem muitos votos positivos para a pergunta, embora os problemas de multithreading sejam muito amplos para o formato de uma resposta, tentarei explicar por que você não deve usar a API do wordpress de maneira multithread.
Não se supõe que TL; DR - PHP esteja pronto para multithreading, o problema não é o próprio PHP, mas principalmente as bibliotecas que ele usa. É por isso que é recomendável não usar o modo de execução multithread no apache, embora em teoria deva ser um pouco mais rápido. Para aumentar o problema de a camada subjacente não estar pronta para multithread, o wordpress core viola o requisito mais básico de multithread - sem acesso livre aos globais.
Qual é o problema com globals em um ambiente multithread? vamos assumir que temos o código de aparência ingênua
function inc() {
global $g;
$g++;
}
Embora seja apenas um liner, não é uma operação atômica para a CPU, e são necessárias várias instruções no nível da máquina para executá-la actoalmente. Algo como
move $g to register D
increment register D
move register D to $g
Agora vamos supor que temos dois threads AB que chamam inc()
ao mesmo tempo (obviamente, com apenas uma CPU não existe o mesmo tempo) e que o valor inicial de $ g é 0, qual seria o valor de $ g depois que os dois threads terminaram? Depende de como o sistema operacional lida com multithreading, quando ele alterna entre threads. Nos sistemas operacionais de estilo "mais antigo", era o trabalho do encadeamento declarar, chamando uma API que o controle pode ser retirado, mas isso leva a muitos problemas com processos de mau comportamento que bloqueiam o sistema no sistema "moderno" que o sistema operacional utiliza. controlar sempre que lhe apetecer. Na vida real, o resultado do código será que $ g terá o valor 2, mas também existe a seguinte possibilidade
No contexto de A
move $g to register D
// value of D is 0
// OS stores the content of registers and switches to thread B
// B increments $g to 1 and finishes working
// OS restores content of registers to the context of thread A
// Value of register D is now 0
increment register D
move register D to $g
O resultado final é que $ g tem o valor de 1.
Obviamente, os globais não são o único problema e o manuseio de entradas e saídas também é essencial para problemas de leitura mútua.
No código multithreading adequado, você usa lock / mutex / semáforo / pipe / soquete .... para serializar o acesso a esses recursos globais para garantir que haverá um resultado previsível para a operação. Wordpress não faz isso.
Inferno, o wordpress não é seguro para vários processos. Na maioria das vezes, ele se livra disso porque o esquema do banco de dados é construído de uma maneira que, na vida real, impede a necessidade de modificar os mesmos dados de diferentes processos (postagens diferentes têm linhas diferentes e não compartilham dados), mas observe o código da barra lateral / widgets e tente imaginar o que acontecerá se dois administradores tentarem adicionar um widget diferente exatamente ao mesmo tempo. Como isso exigirá a manipulação de uma opção específica, o resultado final pode ser um dos dois widgets adicionados ou apenas um deles.
Voltar para multithrading. No unix, diferentemente do Windows, o custo adicional de gerar um processo em vez de encadear é insignificante, portanto, usar wp_remote_get
com algum URL especial para chamar "encadeamento" adicional é uma coisa muito legítima a ser feita e evitar quase todas as armadilhas associadas ao multithreading.