Forum Programmation.perl Threads en Perl dans un CGI

Posté par  (site web personnel) .
É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  (site web personnel) . É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  (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  (site web personnel) . Évalué à 2.

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

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

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

          Posté par  (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.

  • # Le troisième JOIN

    Posté par  (site web personnel) . É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"

Suivre le flux des commentaires

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