Доброе время суток. Ниже приведен часть кода, он рабочий, но при этом сжирается память, на форуме искал (были подобные моменты), я не могу понять как использовать очереди для тредов, помоги пожалуйста. Т.е. мне нужно что работало только $max_threads-колво, ниже код работает так: максимальное кол-во тредов 4, по мере их отмирания создается новый. | Код | main: { $|++; # vars my $max_threads = 4; my %res : shared; my $ref = shared_clone(\%res); my @srubdetails = YAML::LoadFile('srubsdetails.dump'); ################################################################################################
my( $i, @Threads, @run ); while(scalar @Threads < 50) { @run = threads->list(threads::running); if(scalar @run <= $max_threads) { push @Threads, threads->create('p_desc', $srubdetails[$i], $ref); printf("All threads [%d] thread started [%d] left %d/%d\n", scalar(@run), $Threads[$#Threads]->tid, scalar @Threads, scalar @srubdetails); $i++; } @run = threads->list(threads::running); foreach my $thr ( @Threads ) { $thr->join() if $thr->is_joinable(); } @run = threads->list(threads::running); sleep(0.1); }
while (scalar @run != 0) { foreach my $thr (@Threads) { $thr->join if ($thr->is_joinable()); } @run = threads->list(threads::running); } # YAML::DumpFile('description.dump', %res); };
|
|