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

Web Perl Discussion :

Gestion de Timeout Perl


Sujet :

Web Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Par défaut Gestion de Timeout Perl
    Bonjour,
    J’aurais besoin de votre avis sur ce script perl pour me permettre de savoir si la logique du script est correcte.

    J’ai appliqué ce modèle de script pour me permettre de faire appel a des fonctions pour un temps d'execution egal a 60 secondes maximum.

    Si les fonctions mettent plus de 60 secondes au total pour finir leurs instructions, le script passe en traitement d’erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/perl
     
    eval {
        local $SIG{ALRM} = sub { die "TIMEOUT" };
        alarm 60; # on se donne 60 secondes
        #Appel des fonctions...
        alarm 0; # annulation du compteur
    };
    if ( $@ and $@ !~ /TIMEOUT/ ) {
        # traitement d'erreur...
    }

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    N'oublie pas de remettre un alarm 0 après le bloc (pour le cas où il y a eu un die d'une autre origine), ou encore mieux utilise Object::Destroyer (cet article explique très bien le principe).

    --
    Jedaï

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Par défaut
    Merci, ca va donc ressembler a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/usr/bin/perl
     
    eval {
        local $SIG{ALRM} = sub { die "TIMEOUT" };
        alarm 60; # on se donne 60 secondes
        #Appel des fonctions...
        alarm 0; # annulation du compteur
    };
    if ( $@ and $@ !~ /TIMEOUT/ ) {
        # traitement d'erreur...
    }
    alarm 0;

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Humm... Tu n'as pas lu l'article que je t'ai indiqué je pense... Ta solution n'est pas trop mauvaise (il peut y avoir d'autres problèmes selon le code dans le eval() et il vaudrait mieux mettre le alarm(0) avant le if($@) du traitement d'erreur mais la plupart du temps ça devrait aller), mais une solution vraiment béton et simple à mettre en place serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use Object::Destroyer;
     
    eval{
      local $SIG{ALRM} = sub { die "Timed out\n" };
      alarm(5);
      my $sentry = Object::Destroyer->new( sub {alarm(0)} );
      long_running_code();
    };
    if( $@ ) {
      #...
    }
    Object::Destroyer est du pur Perl et consiste en un seul fichier .pm, donc quel que soit ta situation, il est extrèmement facile de l'utiliser.

    --
    Jedaï

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Par défaut
    c'est parfait!

    bon j'avoues... j'ai eu un peu la flemme de lire l'article, je ne suis pas passionne par Perl et c'est purement exceptionnel pour moi de programmer avec, donc je n'ai pas fait mon curieux ;-)

    merci pour ton aide !

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Si tu utilises souvent ce bloc avec timeout, penses à le mettre dans un module à toi (d'habitude lorsque je travaille à un projet, j'ai toujours un petit module MyTools.pm pour les petites fonctions pratiques), comme ça :
    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
    package MyTools;
     
    use base 'Exporter';
    our @EXPORT = qw(timeout);
     
    use Object::Destroyer;
     
    sub timeout {
       my ($delay, $block) = @_;
       eval{
          local $SIG{ALRM} = sub { die "Timed out\n" };
          alarm($delay);
          my $sentry = Object::Destroyer->new( sub {alarm(0)} );
          $block->();
       };
    }
     
    __DATA__
    A utiliser comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use MyTools;
     
    timeout 5, sub { for(my $i = 0;;$i++) { print "ok $i\n"; sleep 1; } };
    if($@ =~ m/Timed out/) {
      #...
    }
    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des timeout
    Par danlyf dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/01/2011, 09h30
  2. création de fichiers : gestion du timeout
    Par nicerico dans le forum Langage
    Réponses: 3
    Dernier message: 22/07/2008, 09h04
  3. Gestion de timeout
    Par kakibend dans le forum Réseau
    Réponses: 8
    Dernier message: 13/02/2008, 17h31
  4. [Struts]Gestion des timeout de session
    Par JohnBlatt dans le forum Struts 1
    Réponses: 3
    Dernier message: 13/12/2004, 14h49
  5. Gestion des timeout
    Par poinclin dans le forum CORBA
    Réponses: 6
    Dernier message: 08/07/2004, 23h40

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