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 :

Problème de timeout dans script perl sur serveur apache


Sujet :

Web Perl

  1. #1
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut Problème de timeout dans script perl sur serveur apache
    Salut à tous,
    je rencontre un problème de timeout lors de l'exécution d'une instruction assez longue dans un de mes script perl utilisé dans une application web :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db->selectFromTable(argXX)
    Cette instruction provenant d'une API (je ne peux donc pas toucher au code de la requête) effectue une requête très lourde provoquant le timeout

    Pour palier ce problème, j'avais pensé utiliser une structure de type "until" affichant un "." tant que le tableau @tab n'est pas rempli avec le retour de la méthode $db->selectFromTable(argXX).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print "." until (
                  @tab =$db->selectFromTable(argXX) ) ;
    Cette solution n'est pas satisfaisante, puisqu'elle ne résout pas mon problème de timeout

    Est ce que quelqu'un a déjà rencontré ce problème ? Pourquoi le "until" ne règle pas le problème ? Je vois des milliers des points afficher à l'écran mais mon script finit par faire un time out ...
    Quelles solutions puis je envisager ?


    Nb : la requête pouvant se réveler assez longue, augmenter de façon très importante la durée avant timeout dans ma configuration Apache n'est pas une solution satisfaisante

    merci d'avance,
    ben

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    et exécuter ta requête dans un Thread séparé ? ensuite tu n'aurais qu'a envoyé le résultat a ton Thread principal pour effectuer le traitement... et ca ne te bloquerais pas.
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  3. #3
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut problème avec le thread dans une boucle ...
    bonjour et merci de ta réponse,
    je ne suis pas très familier avec les threads et je commence à me documenter... http://perl.enstimac.fr/DocFr/perlthrtut.html

    Pour exécuter un thread, je procède de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for my $resultat (@resultat) {
            my $thr = threads->new(\&helloWorld);
    	print $thr->join() ;
    }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub helloWorld {
    	return "hello world" ;
    }
    Cependant, je rencontre un problème : l'instruction qui provoque le timeout (problème initial) est appelée plusieurs fois : elle est placée dans une boucle.

    Lorsque je fais , mon script s'arrête, et la phrase helloworld n'apparait qu'une seule fois dans ma page web...
    Mon fichier de serveur apache, error_log ne comporte pas d'erreur ...
    A noter que si je ne fais pas le reste du code se poursuit et le programme ne plante pas, j'utilise cette méthode car j'ai besoin du résultat retourné par le thread.


    Comment faire pour exécuter mon instruction provoquant le timeout avec un thread sachant que j'ai besoin de récipérer le résultat et que le tout est placé dans une boucle foreach ?

    je suis ouvert à toute suggestion ...

    merci d'avance,
    ben

  4. #4
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    et que fait cette fameuse méthode join() ?
    Il vient peut être de son codage le problème...
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  5. #5
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut join
    d'après la documentation précédemment citée :
    join() fait trois choses : il attend qu'un thread se termine, le nettoie, et retourne les valeurs qu'il peut avoir produites
    sans join() l'application n'est pas forcée d'attendre la fin du thread ... ce qui est problématique
    merci,
    ben

  6. #6
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Déja toutes mes excuses j'avais mal lu plus haut, la méthode join() n'y est pour rien. désolé.

    Le fait que un "hello word" s'affiche montre qu'au moins un thread a été lancé et s'est terminé. Donc ce ce côté la c'est bon.

    Par contre, ta boucle me semble assez bizarre en y regardant de plus près. En considérant que tu souhaite parcourir ta variable " @resultat ", ta boucle devrait ressemblé plutôt à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach my $res (@resultat){
          my $thr = threads->new(\&helloWorld);
          print $thr->join() ;
    }
    et de plus, a ta place j'éviterais d'utiliser le même nom de variable "résultat" , c'est pourquoi je l'ai renommé " res "
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  7. #7
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    Salut,
    les 2 écritures sont équivalentes, for dans ce contexte signifie foreach: ce n'est qu'une commodité d'écriture (proposé par eclipse d'ailleurs).
    De plus, le nom de la variable scalaire de parcours peut être identique au tableau parcouru par le foreach.

    Merci quand même,
    ben

  8. #8
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    ok, je ne connaissais pas cette variante d'écriture...

    Par contre une question qui me vient comme ca, es-tu sure qu'un print

    - n'effacerai pas ta page avant de réecrire dans ton cas ?
    - Es-tu sure que "@resultat" comporte plusieurs valeurs ?
    - Si "@résultat" contient 5 valeurs et que au lieu de "helloWorld" tu affiches un variable que tu incrémente, combien vaut-elle quand ton script s'arrête ?

    Ce sont des choses que je testerais moi... donc au cas ou ca peut t'aider. Sinon je vois pas trop.
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  9. #9
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    merci pour les conseils michon ,

    j'ai l'impression que "join()" fait un peu comme un return : le thread calcul son résultat "affiche un hellloWorl" et il met fin directement à l'application dès qu'il est arrivé à ce niveau sans exécuter le code suivant, un peu comme un return ... enfin ce n'est que mon humble avis

    Je ne pas très familier avec cette technologie, je vais étudier ça plus un profondeur avec la documentation et au besoin je reposterai un post spécifiquement sur les threads

    Pour en revenir au problème de départ, il y a t il un moyen de palier ce problème de timeout ? Pourquoi le "until " ne fonctionne pas ?

    merci d'avance,
    ben

  10. #10
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Pour le problème du Until je ne saurais pas te répondre...
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  11. #11
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    Pour recentrer la discussion sur le problème initial :

    Comment empêcher le timeout dans mon script PERL ?

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Veuillez éviter les messages agressifs en couleur. Ce n'est pas parce que le texte est rouge qu'il y aura plus de réponses.

    Merci.

  13. #13
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut alarm(-1) : semble marcher : quelqu'un peut il confirmer ?
    oups toutes mes excuses pour l'agression visuelle, ce n'était pas le but, j'en prends bonne note pour la suite ,

    je viens de tester une nouvelle solution pour empêcher le timeout : l'utilisation de la fonction alarm.
    D'après la documentation (http://www.tutorialspoint.com/perl/perl_alarm.htm) : elle s'utilise de la sorte :
    alarm EXPR
    Sets the "alarm," causing the current process to receive a SIGALRM signal in EXPR seconds.
    Pour ma part, je l'ai testé avec la valeur '-1' en paramètre et cela semble fonctionner, j'ai lancé l'application avec une grosse requête (pas monstrueuse mais quand même assez lourde) et le job est arrivé à son terme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $SIG{ALRM} = sub {
    print "UNKNOWN: Script timed out\n";
    exit -1;
    };
    # Start the timer to script timeout
    alarm(-1);
    Que pensez vous de cette solution, est elle valable ? Elle ne ressort nulle part : ni dans google, ni dans la littérature ...

    merci d'avance,
    ben

  14. #14
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut alar(-1) fonctionne
    salut à tous,
    voici un retour sur mon précédent post,
    la solution proposée avec alarm(-1) fonctionne
    Le script a tourné tout le week end et crache encore des résultats
    Voici le bout de code qui m'a permis de m'affranchir des problèmes de timeout sans toucher à la configuration du serveur apache

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $SIG{ALRM} = sub {
    print "UNKNOWN: Script timed out\n";
    exit -1;
    };
    # Start the timer to script timeout
    alarm(-1);

    merci pour vos réponses et à bientôt,
    ben

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

Discussions similaires

  1. Appel d'un script Perl sur serveur
    Par DarkVadorette dans le forum Langage
    Réponses: 6
    Dernier message: 17/06/2011, 12h28
  2. Probléme commande shell dans script perl
    Par ApocalypseDuck dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 17h54
  3. Problème de script Bash dans script Perl
    Par Aviator dans le forum Langage
    Réponses: 3
    Dernier message: 03/01/2008, 20h50
  4. scripts cgi sur serveur apache
    Par jejerome dans le forum Apache
    Réponses: 1
    Dernier message: 26/02/2006, 18h10
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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