Вобшем юзаю
http://perldoc.perl.org/threads.html на окнах.
Ставил Active Perl и Strawberry Perl и проблему не решил.
Код:
...
# open file
open(FILE,$f) or die("error $!");
# numbers of threads
$numbers_threads = 3;
# for join all threads
$t_join = 0;
# read file per row
while (<FILE>) {
# create some thread
threads->create({'context' => 'list'},'thread_routine',$_);
# and of file or join all threads
if (eof FILE || $t_join == $numbers_threads) {
$t_join = 0;
my @trl = threads->list;
foreach(@trl){
# retrieve list results from thread
($host,$ver) = $_->join();
undef $_;
# save version in file
if (defined($host) && defined($ver)) {
if (substr($ver,0,1) eq '2') {
open(FILE2,'>>res.txt') or die("error $!");
print FILE2 $host . ' - ' . $ver . "\n";
close(FILE2);
}
}
}
undef @trl;
}
$t_join += 1;
}
close(FILE);
...
Иногда вылетает и пишет "out of memory".
Код:
threads->create({'context' => 'list'},'thread_routine',$_);
threads->create - создаю поток для распараллеливания
{'context' => 'list'} - список будет возвращать thread_routine(моя функция!), возвращает массив из двух элементов.
$_ - некоторая ссылка, которую использует функция thread_routine.
Код:
if (eof FILE || $t_join == $numbers_threads)
когда конец файла с которого считываются данные или создано нужное мне количество потоков
Код:
($host,$ver) = $_->join();
с массива, который возвращает join() некоторого потока заполняю переменные списка, чтоб в будущем записать их в файл, join() добавляет дочерний поток к главному, в это время главный ждет завершения дочернего и так на все потоки...
Как решить проблему с памятью)?
ps
1) если проблему решить, то готовый пример многопочного чекера\сканера версии на перле, только под себя заточить функцию thread_routine с нужной регулярой под себя.
2) однопочный есть, но хочется скорости)