2011年6月23日星期四

Re: [PerlChina] perl多线程如何控制

我建议你永远只起4个线程,然后在每个线程里while (1) {.....},不断地去任务队列里取任务做。

也就是线程池技术。

在 2011年6月24日 上午10:51,Michael Zeng <galaxy2004@gmail.com>写道:
用 wait  , fork 这种就行了吧,很容易控制的
 
网上查下,
 


 
2011/6/24 梁舒华 <suker413@gmail.com>
大家好!我想执行1000个线程,但每次同时执行的最大线程数目为4,这四条线程执行完后再执行另外四条线程,以下代码能实现这个要求。但这样不能充分利用cpu,能不能实现只要一条线程结束就马上生成新的线程,不要等四条都结束才建新的四条线程?

#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Thread::Semaphore;
 
my $max_thread = 4;
my $semaphore = Thread::Semaphore new( $max_thread );
 
sub TestFun
{
    my $num = shift;
        print "print $num in thread ".threads->self()->tid()."\n";
        sleep( 1 );
    }
    # 线程技术,释放一个信号量
    $semaphore->up( );
}
 
sub Wait2Quit
{
    print "Waiting to quit...\n";
 
    my $num = 0;
    while( $num < $max_thread )
    {
        # 尝试获取信号量,当能够获取到最大线程数个信号量时,表示所有线程都结束了
        $semaphore->down( );
        $num ++;
        print "$num thread quit.\n";
    }
    print "All $max_thread thread quit.\n";
}
 
for( my $index = 1; $index <= 1000; $index ++)
{
    # 获取一个信号量,控制并行的线程数量
    $semaphore->down( );
    my $thread = threads->create( &TestFun, $index );
 
    # 剥离线程,不关心返回值,系统自动回收资源
    $thread->detach();
}
 
Wait2Quit( );

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
            Yours Sincerely
                    Zeng Hong

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。



--
---------------------------
Achilles Xu

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

没有评论: