2015-08-27 2 views
2

У меня есть базовый скрипт Perl, который выполняет функцию с 20 потоками.Perl: Сделать нить сна

use threads; 
use threads::shared; 
use Thread::Queue; 
use File::Slurp; 

$| = 1; my $numthreads = 20; 

my $fetch_q = Thread::Queue->new(); 
sub fetch { 
    while (my $target = $fetch_q->dequeue()) { 
     my $request = `curl "http://WEBSITE" -s -o /dev/null -w "%{http_code}"`; # Returns HTTP Status code of request (i.e. 200, 302, 404, etc) 
     if ($request eq "200") { 
      print "Success. Sleeping for 5 seconds."; 
      sleep(5); 
     } 
     else { 
      print "Fail. Will try again in 10 seconds."; 
      sleep(10); 
      redo; 
     } 
    } 
} 

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

Если условие истинно, то я хочу, чтобы нить спать в течение 5 секунд, но есть все остальные потоки продолжают. Прямо сейчас, когда я использую sleep(5), кажется, что весь скрипт спит в течение 5 секунд.

Как использовать sleep() для отдельных тем?

+0

'' cond_timedwait' в нитками :: shared' выглядит многообещающим. – thrig

+0

какая ОС для этого? – ysth

+0

Windows, но у меня установлен cygwin. – Bijan

ответ

3

sleep - правильный инструмент. Я не знаю, почему вы думаете, что он блокирует все потоки, но это не так. Следующее иллюстрирует это:

use threads; 
use threads::shared; 

use Thread::Queue; 

my $fetch_q = Thread::Queue->new(); 

sub fetch { 
    while (defined(my $job = $fetch_q->dequeue())) { 
     if ($job) { 
      print threads->tid, " Starting to sleep\n"; 
      sleep(5); 
      print threads->tid, " Finished sleeping\n"; 
     } 
     else { 
      print threads->tid, " Starting to sleep\n"; 
      sleep(10); 
      print threads->tid, " Finished sleeping\n"; 
     } 
    } 
} 

my @workers = map { threads->create(\&fetch) } 1 .. 2; 
$fetch_q->enqueue($_) for 0, 1, 1; 
$fetch_q->end(); 
foreach my $thr (@workers) {$thr->join();} 

Выход:

1 Starting to sleep 
2 Starting to sleep 
2 Finished sleeping 
2 Starting to sleep <-- The second job picked up work while the first was still sleeping. 
1 Finished sleeping 
2 Finished sleeping 
Смежные вопросы