Я создал скрипт Perl, где я создаю потоки (ограниченные по потокам, выполняемые в то же время), и каждый поток создает свои собственные дети, которые также должны быть ограничены числом ,PERL - многопоточность - дети + внуки - предел потоков работает
Где я размещаю свой скрипт, я не могу запускать больше, чем потоки X на Perl-скрипт. В приведенном ниже примере у меня есть X = 3 x 7 = 21 поток максимум за это время.
- 3 для 1-го задания (
$nb_process_first
) - 7 для 2-го задания (
$nb_process_second
)
Вопросы:
- Есть ли лучший способ управлять потоками и их детей ? (например, очереди - не могли бы вы привести мне пример кода, потому что я пробовал без успеха)
- Мой текущий скрипт не заканчивается со всеми связанными потоками, хотя я использую цикл для всех запущенных потоков, чтобы присоединиться к ним (cf в конце скрипта).
#!/usr/bin/perl -s
use threads;
my @threads;
my $nb_process_first = 3;
my @running =();
print "START" . "\n";
$current = 1;
while ($current <= 10) {
@running = threads->list(threads::running);
if (scalar @running < $nb_process_first) {
print "Launch firstJob=" . scalar @running . "\n";
my $thread = threads->create(\&firstJob);
push(@threads, $thread);
} else {
redo;
}
$current++;
}
my @joinable = threads->list(threads::joinable);
while (scalar @joinable != 0) {
foreach my $thr (threads->list()) {
$thr->join();
}
@joinable = threads->list(threads::joinable);
}
print "END" . "\n";
sub secondJob {
for ($i = 0; $i <= 15; $i++) {
print "secondJob=" . $i . "\n";
sleep 1;
}
threads->exit();
}
sub firstJob {
my $nb_process_second = 7;
my @running =();
$current = 1;
while ($current <= 10) {
@running = threads->list(threads::running);
if (scalar @running < $nb_process_second) {
print "firstJob/Launch secondJob=" . scalar @running . "-" . $current . "\n";
my $secondthread = threads->create(\&secondJob);
push(@threads, $secondthread);
sleep 2;
}
$current++;
}
threads->exit();
}
Спасибо, что очень много песен для вашего ввода. У меня мало вопросов относительно этого примера кода, чтобы быть уверенным, что я это хорошо понял. 1) Я не понимаю, что помещается в очередь первых работников: должен ли список things_to_processs быть этим списком рабочих first_workers? 2) Я не понимаю эту строку my $ thr = threads -> create (\ & worker); Почему мы не создаем потоки -> create (\ & first_worker); ? 3) Я не понимаю, где созданы рабочие рабочие потоки? Надеюсь, вы не против, английский не мой первый язык, я надеюсь, что мои вопросы не будут грубыми. – Seb
Даже с некоторыми из «возможно исправлений», о которых я говорю в своем предыдущем комментарии, скрипт работает неправильно. Если вы можете помочь мне с правильным. Благодарю. например: Не удается найти метод объекта «конец» через пакет «Thread :: Queue» – Seb
Это создание - опечатка. Должно быть first_worker. Ред. Если «end» не найден, обновите 'Thread :: Queue'. 'perl -MCPAN -e shell'' установить Thread :: Queue'. – Sobrique