Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Помогите разобраться с очередями Thread::Queue


Автор: ky0x5a 6.2.2012, 13:47
Доброе время суток. Ниже приведен часть кода, он рабочий, но при этом сжирается память, на форуме искал (были подобные моменты), я не могу понять как использовать очереди для тредов, помоги пожалуйста.

Т.е. мне нужно что работало только $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);
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)