У меня есть модуль, который запускает несколько потоков и нажимает их на список потоков.Можно ли повторно использовать связанные темы в perl?
например:
#!/usr/bin/perl
#test_module.pm
package test_module;
use strict;
use warnings;
use threads;
sub main {
my $max_threads = 10;
my @threads =();
# create threads
while (scalar @threads < $max_threads) {
my $thread = threads->new(\&thread_sub);
push @threads, $thread;
}
# join threads
for my $thread (@threads) {
$thread->join();
}
}
sub thread_sub {
my $id = threads->tid();
print "I am in thread $id\n";
}
1;
Проблема заключается в том, что я называю этот модуль несколько раз из одного сценария Perl и вместо устранения старых потоков и создание новых, поток иды просто держать приращением. Я слышал, что если вы не избавитесь от старых потоков в Perl, это приведет к утечке памяти и замедлит вашу программу, это правда? Являются ли данные из моих старых потоков просто сидящими в памяти занимающими пространство?
Если это может стать большой проблемой, так как мой скрипт будет частью гораздо более крупной программы, которая может генерировать сотни или тысячи потоков, все из которых будут занимать память даже после того, как они будут использованы. Как я могу остановить это? Могут ли мои потоки повторно использоваться?
Вот пример скрипта, который вызовет модуль и покажет, как потоки будут продолжать увеличиваться, даже если я присоединился к старым потокам (я думал, что «присоединиться» к тому, как вы их очистили, я что-то не так ?) Как будет использоваться этот скрипт, я не могу позволить себе иметь память из старых потоков, сидящих там, занимая пространство.
например:
#!/usr/bin/perl
#testing.pl
use strict;
use warnings;
use test_module;
test_module::main();
test_module::main();
test_module::main();
system 'pause';
Спасибо!
Почему вы хотите, чтобы идентификаторы потоков были повторно использованы? –
Я думаю, что мне действительно интересно, если все потоки памяти действительно выпущены после «присоединения». Тот факт, что идентификаторы продолжают увеличиваться, кажется, что старые потоки все еще существуют как-то в памяти, даже если они уже «соединены». – tjwrona1992
Приращение идентификатора нити - это такая же красная селедка, как и увеличение идентификатора процесса. Ни то, ни другое не означает, что происходит истощение. – Sobrique