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

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    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 chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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
    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.

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    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 chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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
    Par défaut
    et que fait cette fameuse méthode join() ?
    Il vient peut être de son codage le problème...

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    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 chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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
    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 "

+ 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