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

e5472   
   Á¶È¸ 4139   Ãßõ 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 2429/5688
2015-12   1536310   ¹é¸Þ°¡
2014-05   5000430   Á¤ÀºÁØ1
2007-01   4653   ÀÌÁ¾¿ø
2015-10   4653   ȲȥÀ»ÇâÇØ
2017-09   4653   carrot
2016-04   4653   guest1
2016-03   4653   »ßµ¹À̽½ÇÄÀÌ
2016-12   4653   Çϱվƺü
2013-02   4653   ÀÚ¿¬ÀÎ
2016-12   4653   AplPEC
2016-08   4653   Áö´ÏÄÄI¿µÁø
2007-07   4653   ¹ÚÂù¼º
2006-09   4653   Çѽ¿Ï
2007-04   4653   ¹æÇѼº
2017-01   4653   sungsung
2007-02   4653   ±èÁ¾±¸
2014-02   4653   ±è¹ÎöGC
2007-05   4654   ¹èÁ¤ÇÑ
2016-07   4654   º°¿¡¼­¿Â±×³à
2006-11   4654   ¹ÚÁ¾±¹
2017-11   4654   ¿©ÁÖ³ó¹Î76
2005-11   4654   ±èÁöȯ