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

e5472   
   Á¶È¸ 4098   Ãßõ 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 2400/5680
2015-12   1484079   ¹é¸Þ°¡
2014-05   4947425   Á¤ÀºÁØ1
2016-04   5961   Sunrise
2016-04   5390   Äɸ®½º
2016-04   4601   ¾ó»§ÀÌ»ç
2016-04   8343   ±èÈñ¿µ
2016-04   3692   ±è°Ç¿ì
2016-04   14377   ¿¡À̾¾ÇÇÀ¯
2016-04   4787   ¹Ú¹®Çü
2016-04   5125   Æ۽̱Û
2016-04   4531   AKMU
2016-04   4678   cclim
2016-04   5035   »§µ¹À̽º
2016-04   6195   werx
2016-04   5901   NeOpLE
2016-04   4987   ±è¿µÇÑ
2016-04   5239   JSYoon
2016-04   3811   ¹Ú¹ÎÁ¦
2016-04   4778   ½Ç¹ö¾Ö·Î¿ì
2016-04   10925   ´ëÀü»ç¶÷
2016-04   3836   izegtob
2016-04   7107   ½É¿ìö