Multithreading Perl线程:Sleep()的行为如何

Multithreading Perl线程:Sleep()的行为如何,multithreading,perl,sleep,thread-sleep,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"

我有下面的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)时,整个程序似乎都停止了(这是正确的吗?)。另外,我如何使单个线程睡眠

当我调用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
没有做到这一点是错误的

当我调用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
另外,我如何使单个线程睡眠


不使用
睡眠
可以实现这一点,但我认为你认为
睡眠
没有做到这一点是错误的。

我指的是后者。从我的测试来看,整个程序似乎暂停了5秒钟,因此我想了解如何使单个线程休眠/暂停5秒钟。由于所有线程都调用
sleep
,您如何区分这段代码的不同之处?我指的是后者。从我的测试来看,整个程序似乎暂停了5秒钟,因此我想了解如何使单个线程休眠/暂停5秒钟。既然所有线程都调用了
sleep
,您如何区分这段代码的不同?那么我如何使整个程序暂停
x
秒呢?您不能直接这样做。每个线程独立于其他线程执行。每个线程必须相互协调。所有的活动不会瞬间停止;速度的快慢取决于线程检查“snooze指令”的频率。那么我如何使整个程序暂停
x
秒呢?您不能直接这样做。每个线程独立于其他线程执行。每个线程必须相互协调。所有的活动不会瞬间停止;速度的快慢取决于线程检查“snooze指令”的频率。