Forum Programmation.perl Threads en Perl dans un CGI

Posté par  .
Étiquettes : aucune
0
14
sept.
2005
J'ai un CGI qui appelle trois threads :

$thr1 = threads->new(\&sub1, "linux");
$thr2 = threads->new(\&sub1, "bsd");
$thr3 = threads->new(\&sub1, "windows");

Ensuite, je fais en sorte d'attendre les threads :

$data1 = $thr1->join;
$data2 = $thr2->join;
$data3 = $thr3->join;

La fonction sub1 est assez stupide :

sub sub1 {
my @Parametres = @_;
return "\"@Parametres\"";
}

Trois fois sur quatre, le script plante lors de l'appel au troisième thread...

Si je rajoute un sleep (5) dans la fonction, par contre, ça marche.

sub sub1 {
my @Parametres = @_;
return "\"@Parametres\"";
sleep (5);
}

Je ne comprends pas trop bien ces problèmes. Quelque-chose m'échappe-t-il (c'est la première fois depuis longtemps que je retravaille avec des threads et je débute en Perl) ?

Merci pour votre aide.
  • # Oups

    Posté par  . Évalué à 2.

    Oups, bien sûr, j'ai fais une erreur en expliquant mon cas => remonter le sleep d'une ligne :
    sleep (5);
    return "\"@Parametres\"";
  • # maizencor ?

    Posté par  (courriel, site web personnel) . Évalué à 2.

    Et il dit quelque chose en plantant ? Un message d'erreur pourrait aider.

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: maizencor ?

      Posté par  . Évalué à 2.

      Il y a un bon mode debug en Perl qui affiche des erreurs en clair ?
      • [^] # Re: maizencor ?

        Posté par  . Évalué à 2.

        Pour Perl en CGI, je précise.
        • [^] # Re: maizencor ?

          Posté par  (courriel, site web personnel) . Évalué à 2.

          Si le script plante, il y a sans doute une trace dans les logs du serveur web. Pas oublier d'utiliser "use warnings" (ou -w). Il y a aussi sans doute moyen de rediriger STDERR vers un fichier (au pire il y a toujours $SIG{__WARN__}), RTFM.

          pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

          • [^] # Re: maizencor ?

            Posté par  . Évalué à 2.

            Pour le -w, il est déjà mis, mais je n'ai aucun message quand le problème survient...
  • # Le troisième JOIN

    Posté par  . Évalué à 2.

    J'ai posté un test ici :
    http://www.developpez.net/forums/viewtopic.php?t=398425(...)
    C'est précisement le troisième join qui cale...
    • [^] # Re: Le troisième JOIN

      Posté par  . Évalué à 3.

      Bin, euh, chez moi ça fonctionne ton truc.

      Pour diagnostiquer les erreurs tu peux t'aider des pragmas strict et diagnostics:


      #!/usr/bin/perl -w

      use strict;
      use diagnostics;
      use threads;

      sub sub1 {
          my @Parametres = @_;
          return "\"@Parametres\"";
      }

      my $thr1 = threads->new(\&sub1, "linux");
      my $thr2 = threads->new(\&sub1, "bsd");
      my $thr3 = threads->new(\&sub1, "windows");

      my $data1 = $thr1->join;
      my $data2 = $thr2->join;
      my $data3 = $thr3->join;

      print "data1: $data1\ndata2: $data2\ndata3: $data3\n"


      $ perl ./threads2.pl
      data1: "linux"
      data2: "bsd"
      data3: "windows"
      • [^] # Re: Le troisième JOIN

        Posté par  . Évalué à 2.

        Merci pour les pragmas, je ne les connaissais pas.

        Le code marche, en effet. J'ai changé d'hébergeur pour ce site et tout est maintenant nickel.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.