Catégories

Parallélisation facile en Perl

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:

http://www.perlmonks.org/?node_id=291446

2 commentaires pour Parallélisation facile en Perl

  • Dan121

    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).

Faire un commentaire

 

 

 

Vous pouvez utiliser ces tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre user="" computer="" escaped="">