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文档,也可能阅读这篇关于信号量的维基百科文章.
| 归档时间: |
|
| 查看次数: |
1016 次 |
| 最近记录: |