2015-12-23 3 views
0

У меня есть следующий скрипт Perl, который создает 10 потоков и вызывает функцию 1000 раз. В этой функции есть только печать (для отладки) и sleep(5)Perl Темы: Как работает Sleep() behash

Вот 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) кажется, что вся программа останавливается (это правильно?). Также как я могу сделать отдельный поток сна?

+0

Я имел в виду последнего. Из моего тестирования это выглядит так, как вся программа останавливается в течение 5 секунд, поэтому я хочу узнать, как сделать отдельный поток сна/остановку в течение 5 секунд. – Bijan

+2

Поскольку все ваши темы называются 'sleep', как вы могли бы отличить этот код? –

ответ

4

Когда я называю sleep(5) кажется, что вся программа останавливается (это правильно?).

Вы говорите, что видите только один номер каждые 5 секунд? Я вижу 10 чисел каждые 5 секунд, то есть 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 не делает именно это.

+0

Тогда как бы я сделал полную остановку программы для 'x' секунд – Bijan

+2

Вы не можете напрямую. Каждый поток выполняется независимо от других. Каждая нить должна была бы координировать друг с другом. Вся деятельность не прекращалась мгновенно; насколько быстро зависит от того, как часто потоки проверяют «команду отсрочки». – ikegami

Смежные вопросы