2010-11-15 6 views
-1

Je suis complètement nouveau à Perl, comme newbie absolue. J'essaye de développer un système qui lit une base de données et, selon les résultats, génère une file d'attente qui lance un autre script.Perl script multi thread ne fonctionne pas en parallèle

HERE est le code source.

Maintenant le script fonctionne comme prévu, sauf que j'ai remarqué qu'il ne fait pas vraiment les threads parallèles. Que j'utilise 1 thread ou 50 threads, le temps d'exécution est le même; 1 thread est encore plus rapide. Quand j'ai le script d'affichage quel thread a fait quoi, je vois que les threads ne fonctionnent pas en même temps, car il fera le fil 1, puis 2, puis 3 etc

Est-ce que quelqu'un sait ce que j'ai fait de mal ici? Encore une fois, le script fonctionne, mais pas dans les threads parallèles.

Répondre

10

Vous devez savoir ce que sont réellement les sémaphores avant de les utiliser. Vous avez dit explicitement les fils pas pour fonctionner en parallèle:

my $s   = Thread::Semaphore->new; 
#... 

    while ($queue_id_list->pending > 0) { 
     $s->down; 
     my $info = $queue_id_list->dequeue_nb; 
     if (defined($info)) { 
      my @details = split(/#/, $info); 
      #my $result = system("./match_name db=user_".$details[0]." id=".$details[1]); 
      # normally the script above would be launched which is a php script run in php-cli and does some database things 

      sleep(0.1); 

      #print "Thread: ". threads->self->tid. " - Done user: ".$details[0]. " and addressbook id: ". $details[1]."\r\n"; 
      #print $queue_id_list->pending."\r\n"; 
     } 
     $s->up; 
    } 

Vous avez créé un sémaphores $s, qui, par défaut a un compte de 1. Ensuite, dans la fonction que vous essayez d'exécuter, vous appelez $s->down au début - ce qui diminue le nombre de 1, ou des blocs si le compte est déjà < 1 et $s->up à la fin, ce qui augmente le nombre de 1.

une fois qu'un thread appelle down, aucun autre les threads s'exécuteront jusqu'à ce qu'il appelle de nouveau up.

Vous devez également lire attentivement the Thread::Semaphore docs et probablement this wikipedia article on semaphores.

+0

Donc ce que vous dites (corrigez-moi si je me trompe) si je supprime le sémaphore cela fonctionnerait? Comme je l'ai dit ... newbie on perl – renevdkooi

+1

@renevdkool: En supposant que vous ne fassiez rien qui ait besoin d'être sérialisé. Pourquoi avez-vous mis le sémaphore là en premier lieu? –

+0

en fait je n'en ai aucune idée. J'ai utilisé un exemple de script de threading et l'ai modifié en fonction de ma situation. L'idée est venue d'un script webcrawler. Je pensais juste que j'en avais besoin. – renevdkooi