IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

threads: local directory


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 28
    Par défaut threads: local directory
    Hello,


    voilà, je cherche a effectuer via un script perl un chaine de traitement sur différents fichiers qui se trouvent dans deux répertoires distincts. Pour gagner du temps, je désire utiliser deux threads (un par répertoire).
    Mon problème c'est qu'un chdir s'applique à tous les threads, je ne vois donc pas comment traiter simultanément mes deux chaines de traitement dans chacun des deux répertoires. Voici mon script (qui ne fonctionne pas tout à fait donc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #!/usr/bin/perl
     
    use threads::shared;
     
    my $usage = "monscriptperl homedir im1 im2";
     
     
     if ($#ARGV < 0 || $#ARGV > 2)
          {
          print "$usage\n";
          exit 1;
          }
     
     
     
    $dir=$ARGV[0];
    @filers = ($ARGV[1],$ARGV[2]);
     
    my @threads = ();
     
    foreach $filer (@filers)  {
       push (@threads, threads->create (\&thread_func, $filer));
    }
     
     
    foreach (@threads) {
       $_->join(); # blocks until this thread exits
    }
    exit(0);
    sub thread_func {
     $image=$ARGV[@threads+1];
     
     chdir("$workdir");   
     $cmd="$process $image";
     system ($cmd);
    }

    Voilà, on demander à l'utilisateur deux noms de fichiers qui sont respectivement placés dans deux répertoires et et je veux appliquer ma chaîne de traitement (sous la variable $process) simultanément. Comme vous le savez, le chdir pose problème puisqu'il s'applique à tous les threads. Je débute en perl, mais je n'ai pas trouvé de réponse dans le tutoriaux ni sur le forum.

    Merci pour toute aide !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 28
    Par défaut
    Yep, le problème se résout de la manière suivante :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    package ex::threads::safecwd;
     
    use 5.008;
    use strict;
    use warnings;
    use threads::shared;
    our $VERSION = '0.01';
     
     use Cwd;
     our $cwd = cwd;  #our per thread cwd, init on startup from cwd
     our $cwd_mutex : shared; # the variable we use to sync
     our $Cwd_cwd = \&Cwd::cwd;
     *Cwd::cwd = *my_cwd;     
    sub my_cwd {
    	     lock($cwd_mutex);
    	     CORE::chdir($cwd);
    	     $Cwd_cwd->(@_);
    }
     
    *CORE::GLOBAL::chdir = sub {
    	lock($cwd_mutex);
    	CORE::chdir($_[0]) || return undef;
    	$cwd = $Cwd_cwd->();
    };
     
    *CORE::GLOBAL::mkdir = sub {
    	lock($cwd_mutex);
    	CORE::chdir($cwd);
    	if(@_ > 1) {
    		CORE::mkdir($_[0], $_[1]);
    	} else {
    		CORE::mkdir($_[0]);
    	}
    };
     
    *CORE::GLOBAL::rmdir = sub {
    	lock($cwd_mutex);
    	CORE::chdir($cwd);
    	CORE::rmdir($_[0]);
    };

Discussions similaires

  1. Développement Web: Thread local
    Par ghiwani80 dans le forum JSF
    Réponses: 4
    Dernier message: 05/12/2011, 12h44
  2. copie des fichiers d'un ftp à mon "local directory"
    Par franckesh007 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 26/09/2008, 18h11
  3. thread local problème
    Par nadsky dans le forum Général Java
    Réponses: 16
    Dernier message: 20/05/2008, 12h41
  4. [Conception] Thread local
    Par smutmutant2003 dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 29/01/2007, 22h04
  5. Problème droit dans active directory et sur pc local
    Par krfa1 dans le forum Windows XP
    Réponses: 2
    Dernier message: 17/01/2006, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo