代码之家  ›  专栏  ›  技术社区  ›  renevdkooi

Perl脚本多线程不并行运行

  •  -1
  • renevdkooi  · 技术社区  · 14 年前

    我对Perl完全陌生,就像一个新手。我正在尝试开发一个系统,它读取一个数据库,并根据结果生成一个队列来启动另一个脚本。

    HERE 是源代码。

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

    有人知道我做错了什么吗?同样,脚本本身也可以工作,只是不能在并行线程中工作。

    1 回复  |  直到 14 年前
        1
  •  10
  •   Nicholas Knight    14 年前

    在开始使用信号量之前,您需要了解信号量实际上是什么。你已经明确地告诉了线程 并行运行:

    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 也是。