Comment paralléliser facilement des traitements en utilisant Perl ?
Il suffit d’utiliser le module « Parallel::ForkManager ». Celui-ci créé des processus qui traitent indépendamment les itérations d’une boucle, tout en restant limité au nombre de processus spécifié.
Ce module est disponible dans Debian GNU/Linux et dérivées (Ubuntu, …) sous le nom libparallel-forkmanager-perl:
Installation:
# apt-get install libparallel-forkmanager-perl
Voici un petit exemple d’utilisation, permettant de paralléliser le redimensionnement d’images (pensez à installer imageMagick is vous voulez tester cet exemple):
#!/usr/bin/perl -w use strict; use warnings; use Parallel::ForkManager; my $size = "1024"; my $max_process = 4; my $filter = "lanczos"; my $pm = new Parallel::ForkManager($max_process); my $resized; foreach my $image (@ARGV) { # Fork my $pid = $pm->start and next; # Début du traitement # Construction du nom de l'image redimensionnée # image.jpg -> image-size.jpg ( $resized = $image ) =~ s/.(w+)$/-$size.$1/; # Redimensionnement system("convert -resize $size -filter $filter "$image" "$resized"" ); # Affiche des points de progression... print '.'; # Fin du traitement $pm->finish; } # Attente de tous les sous-processus avant de continuer $pm->wait_all_children; print "done\n"; exit 0;
Une présentation un peu plus approfondie:
Très pratique à utiliser !!
Merci pour cet exemple.
Si je veux par exemple que chacun de mes threads écrivent dans un même fichier de log par exemple (certainement pas en même temps ) comment faire ??
En fait, vous pouvez écrire dans un seul fichier de log en même temps, cela fonctionne généralement très bien (les lignes sont bien sûr mélangées mais jamais tronquées). Sinon vous pouvez déléguer cette tâche au démon Syslog en utilisant Sys::Syslog. Une petite précision, il ne s’agit pas ici de threads mais bien de processus classique (processus lourds).