Perl线程:Sleep()如何表现

时间:2015-12-23 00:07:32

标签: multithreading perl sleep thread-sleep

我有以下Perl脚本创建10个线程并且调用函数1000次。在此函数中只有一个打印(用于调试)和sleep(5)

这是Perl脚本:

use threads;
use threads::shared;
use Thread::Queue;

my $fetch_q   = Thread::Queue->new();
sub fetch {
    while ( my $num = $fetch_q->dequeue() ) { 
        print "$num\n";
        sleep(5);
    }
}

my @workers = map { threads->create( \&fetch ) } 1 .. 10;
$fetch_q->enqueue( 1 .. 1000 );
$fetch_q->end();
foreach my $thr (@workers) {$thr->join();}

当我拨打sleep(5)时,整个程序似乎停止了(这是正确的吗?)。另外,我如何让单个线程睡眠?

1 个答案:

答案 0 :(得分:4)

  

当我拨打sleep(5)时,似乎整个程序都停止了(这是正确的吗?)。

你是说你每5秒只看一个号码?我每隔5秒就会看到10个数字,这意味着sleep只会让当前线程进入休眠状态。

您可以使用以下程序更清楚地看到它:

use threads;

async {
   print "Before sleep\n";
   sleep 5;
   print "After sleep\n";
};

async {
   for (1..6) {
      print "Boop\n";
      sleep 1;
   }
};

$_->join for threads->list;

输出:

Before sleep
Boop
Boop
Boop
Boop
Boop
After sleep
Boop
  

另外我如何让单个线程睡眠?

有一些方法可以在不使用sleep的情况下实现这一目标,但我认为你错误地认为sleep没有做到这一点。