Perl¿¡¼­ Thread::Pool ¸ðµâ »ç¿ëÇغ¸½Å ºÐ °è½Ã³ª¿ä?

e5472   
   Á¶È¸ 4133   Ãßõ 0    

안녕하세요...

Perl의 Thread::Pool 0.33 모듈 사용시..

http://search.cpan.org/~elizabeth/Thread-Pool-0.33/lib/Thread/Pool.pm

구 버전 환경(Cent 4.7아니면 5.3, 아니면 5.8 + Perl 5.8.? 확실하지가 않네요 ㅠㅠ)에서는 문제가 없던 내용이...  

OS및 Perl 버전이 업데이트 된후 (CentOS 6.7 + Perl 5.10.1) 문제가 생기네요..


예전에는 이 상태로....

#!/usr/bin/perl

use strict;
use warnings;
use Thread::Pool;

main();
sub main {
        my $pool = Thread::Pool->new (
        {
            optimize => 'cpu',
            do => \&execute,
            workers => 3,
            maxjobs => 5,
            minjobs => 1,
            pre => sub {print "anonymous sub preparing the jobs\n"},
            post => sub {print "anonymous sub cleaning up after the worker removed\n"},
        }
        );

        for (my $i = 0; $i < 5; $i++ ) {
                my $jobId = $pool->job("idx: $i");
        }
        $pool->join;
}

sub execute {
    my ($param) = @_;
    sleep 3;
    print "$param\n";
}



예전에는 위의 상태에서 동작이 잘 되었습니다.

그런데...

OS 및 Perl이 업그레이드 된 환경에서는 실행을 하면...

# ./test.pl
anonymous sub preparing the jobs
anonymous sub preparing the jobs
anonymous sub preparing the jobs
Perl exited with active threads:
        3 running and unjoined
        0 finished and unjoined
        0 running and detached
#


이렇게 끝나더러라구요..

그런데.. 재미있는 점은 $pool->join대신에 $pool->shutdown으로 바꾸어 쓰면 의도한대로 잘 동작합니다.

# ./test.pl
anonymous sub preparing the jobs
anonymous sub preparing the jobs
anonymous sub preparing the jobs
idx: 0
idx: 1
idx: 2
anonymous sub cleaning up after the worker removed
idx: 3
idx: 4
anonymous sub cleaning up after the worker removed
anonymous sub cleaning up after the worker removed
#


예전부터 사용했던 코드가 이상했던 걸까요?

그리고 Thread::Pool 생성시 기본 autoshutdown 속성이 1이여서  pool의 shutdown메서드가 자동으로 호출되었어야

할 것 같은데.. 이게 정상적으로 수행안되는 상황 같기도 하고....ㅠㅠ


그런데 찾아보니... Thread:Pool::Simple이라는 다른 모듈도 있던데... 

http://search.cpan.org/~jwu/Thread-Pool-Simple-0.25/Simple.pm

이게 다른 모듈 종속성도 없어 괜찮아보이고.. 원하는대로 잘 동작하던데..

이 모듈 사용하시는 분도 계시는지 궁금하네요..

#!/usr/bin/perl

use strict;
use warnings;
use Thread::Pool::Simple;

main();
sub main {
        my $pool = Thread::Pool::Simple->new (
            min => 3,
            max => 5,
            do => [\&execute],
            load => 10,
            init => [sub { print "init\n" }],
            post => [sub { print "post\n" }],
            pre => [sub { print "pre\n" }],
        );

        for (my $i = 0; $i < 5; $i++ ) {
                $pool->add("idx: $i");
        }

        $pool->join();
}

sub execute {
    my ($param) = @_;
    sleep 3;
    print "$param\n";
}


Perl 에대해 잘모르는 상태에서 보려니 뭔가 시행착오가 많네요 ㅠㅠ


감사합니다.


ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.


QnA
Á¦¸ñPage 3714/5687
2015-12   1530096   ¹é¸Þ°¡
2014-05   4994160   Á¤ÀºÁØ1
2014-10   4141   ¹Ù¶ó±âIÀ̵¿¿Ï
2017-03   4141   ±èÁöÈÆ83
2016-09   4141   ´Þ¸±±î
2015-02   4141   Á¤´Ù¿î
2015-09   4141   °Ü¿ï³ª¹«
2021-01   4141   ¿µ»êȸ»ó
2014-01   4141   ³ªÆÄÀÌ°­½ÂÈÆ
2016-02   4141   ¸¸³âÃʺ¸
2016-10   4141   ³ª³ª³ª³ª³ª
2019-03   4141   ¼ÛÁÖÇü
2018-04   4140   ¼®È£
2019-03   4140   ¾Ç¸¶¶ó³×
2016-10   4140   »ßµ¹À̽½ÇÄÀÌ
2016-11   4140   Sunrise
2014-02   4140   À̽ã¿ì
2014-09   4140   ¸¸³âsnow
2017-03   4140   Àü»êoa
2014-12   4140   ¾Æ¸¶µ¥¿ì¾²
2016-07   4140   ȸ·ÎÀïÀÌ
2017-03   4140   ĵÀ§µå