Paralléliser des commandes avec Symfony sur Linux

Retour aux articles Dans #php le 03/10/2016 par Emmanuel BALLERY

Paralléliser des commandes avec Symfony sur Linux

Quand certaines commandes prennent du temps à s'éxécuter, profiter du multi-threading de la machine peut être interessant. Un processus PHP est monothreadé, autrement dit il ne pourra utiliser que 100% d'un thread de la machine, sans avoir la possibilité d'utiliser les autres. Décomposer une tâche pour que chaque sous-partie s'éxécute dans un thread distinct peut donc être rentable.

Worflow

J'ai une centaine de commandes assez lourdes à éxécuter sur ma machine. Au lieu d'attendre la fin du traitement d'une commande pour lancer la suivante (travail en série), je les parallelise. Pour cela, je me fixe un nombre limite de commande à traiter simultanéement (inférieur au nombre de thread de la machine) et j'éxécute les premières. Dès que l'une d'elles se termine, j'en lance une nouvelle, occupant ainsi tous les threads constamment.

Un exemple d'implémentation :

Implémentation

J'utilise une classe abstraite de commande Symfony, on pourrait aussi créer un service.

Utilisation

Test

En éxécutant un simple sleep 100 fois (en guise de commande), avec un temps d'attente compris entre 1 et 5 secondes aléatoirement, j'arrive au résultat suivant :

  • En série, le traitement aurait pris 282 secondes ;
  • En parallèle cela m'a pris 55 secondes ;

Ces résultats varient en fonction de la tâche, de la machine, du nombre de commande, ... Il faut donc tester par soi-même.

Retour aux articles