Использование максимального количества потоков на многоядерном процессоре - PullRequest
3 голосов
/ 10 июля 2011

сначала, мои навыки perlskills ограничены, поэтому, пожалуйста, имейте это в виду. ;)

Я написал perlscript, который индексирует каталог и что-то делает для каждого файла в нем.

Обработка файла занимает некоторое время. От 1 до 5 минут каждый при загрузке процессора почти 100% (одно ядро). Моя идея, потому что у меня есть процессор с четырьмя ядрами, чтобы обрабатывать более одного файла одновременно, что приводит меня к потокам Perl.

Итак, вот мои вопросы.

1) Верно ли мое предположение, что потоки perl автоматически распределяются между несколькими ядрами?

2) Я нашел этот пример кода, который делает то, что мне нужно, я думаю, но я не могу понять, как поддерживать активными только 8 потоков. Пример запускает статический подсчет потоков и выполняется после их обработки. Однако в моем случае, скажем, 50 файлов для обработки, но одновременно должны быть активны только 8 потоков.

Так должно быть так: Прочитайте каталог, запустите 8 потоков для 8 первых файлов и продолжайте работу 8 потоков, пока все файлы не будут обработаны.

#!/usr/local/roadm/bin/perl
# This is compiled with threading support

use strict;
use warnings;
use threads;
use threads::shared;

print "Starting main program\n";

my @threads;
for ( my $count = 1; $count <= 10; $count++) {
        my $t = threads->new(\&sub1, $count);
        push(@threads,$t);
}   
foreach (@threads) {
        my $num = $_->join;
        print "done with $num\n";
}   
print "End of main program\n";

sub sub1 {
        my $num = shift;
        print "started thread $num\n";
        sleep $num;
        print "done with thread $num\n";
        return $num;
}   

Источник: https://wiki.bc.net/atl-conf/pages/viewpage.action?pageId=20548191

Я искал несколько часов, но не нашел примера, как это сделать. Было бы неплохо, если бы кто-нибудь дал мне подсказку, как начать.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 10 июля 2011

Потоки в Perl тяжелые; они требуют времени и процессора для запуска, а время и процессор - для обмена данными между ними (и требуют, чтобы вы тщательно проверяли, какие модули вы используете для обеспечения безопасности потоков).

Вам часто намного лучше разветвляться; Parallel :: ForkManager делает это простым.

5 голосов
/ 10 июля 2011

Хорошее решение вашей проблемы с использованием Thread :: Queue и числом рабочих * *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...