2010-11-15 3 views
-1

Я совершенно новый для Perl, как абсолютный новичок. Я пытаюсь разработать систему, которая читает базу данных и, согласно результатам, генерирует очередь, которая запускает другой скрипт.Perl скрипт несколько потоков не работает параллельно

HERE - исходный код.

Теперь скрипт работает так, как ожидалось, за исключением того, что я заметил, что на самом деле эти потоки не параллельны. Использую ли я 1 нить или 50 потоков, время выполнения такое же; 1 поток еще быстрее. Когда у меня есть сценарий, какой поток сделал что-то, я вижу, что потоки не запускаются одновременно, потому что он будет делать нить 1, затем 2, затем 3 и т. Д.

Кто-нибудь знает, что я сделал неправильно Вот? Снова сам скрипт работает, а не параллельно.

ответ

10

Вам нужно узнать, что такое семафоры на самом деле, прежде чем вы начнете их использовать. Вы явно сказали темы не работать в параллель:

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; 
    } 

Вы создали семафор $s, который по умолчанию имеет счетчик 1. Затем в функции, которую вы пытаетесь запустить, вы звоните $s->down на старте - что уменьшает счетчик на 1, или блоки, если счетчик уже < 1, и $s->up в конце, который увеличивает счетчик на 1.

После того, как поток вызывает down, никакой другой потоки будут выполняться до тех пор, пока он не вызовет up.

Вы должны внимательно прочитать the Thread::Semaphore docs и, возможно, this wikipedia article on semaphores, тоже.

+0

Так что вы говорите (исправьте меня, если я ошибаюсь), если я удалю семафор, это сработает? Как я уже сказал ... новичок на perl – renevdkooi

+1

@renevdkool: Предполагая, что вы не делаете ничего, что должно быть сериализовано. Почему вы поставили семафор в первую очередь? –

+0

На самом деле я понятия не имею. Я использовал примерный сценарий потоковой передачи и отредактировал его в моей ситуации. Идея исходила из сценария webcrawler. Я просто подумал, что мне это нужно. – renevdkooi

Смежные вопросы