Perl脚本多线程没有并行运行

ren*_*ooi -1 mysql perl multithreading

我对Perl来说是全新的,就像绝对的新手一样.我正在尝试开发一个读取数据库的系统,并根据结果生成一个启动另一个脚本的队列.

是源代码.

现在脚本按预期工作,除了我注意到它并没有真正使线程并行.无论我使用1个线程还是50个线程,执行时间都是一样的; 1个线程甚至更快.当我有脚本显示哪个线程做了什么,我看到线程不会同时运行,因为它将执行线程1,然后是2,然后是3等.

有谁知道我在这里做错了什么?脚本本身也可以工作,而不是并行线程.

Nic*_*ght 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;
    }
Run Code Online (Sandbox Code Playgroud)

你已经创建了一个信号量$s,默认情况下它的计数为1.然后在你试图运行的函数中,你$s->down在开始时调用- 这会使计数减少1,或者如果计数已经<1则阻塞,$s->up最后,将计数增加1.

一旦线程调用down,在up再次调用之前,其他线程都不会运行.

您应该仔细阅读Thread :: Semaphore文档,也可能阅读这篇关于信号量的维基百科文章.