Многопоточный сценарий Perl не работает параллельно - PullRequest
0 голосов
/ 15 ноября 2010

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

ЗДЕСЬ - исходный код.

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

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

1 Ответ

10 голосов
/ 15 ноября 2010

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

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, и <code>$s->up в конце, который увеличивает счет на 1.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...