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

e5472   
   Á¶È¸ 4184   Ãßõ 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 2438/5696
2015-12   1566644   ¹é¸Þ°¡
2014-05   5030095   Á¤ÀºÁØ1
2015-09   4695   ³¶¸¸ÄÉÀÌ
2016-11   4695   ¹Ð¿ì
2017-12   4695   °³¹é¼ö28È£
2013-12   4696   Twin
2007-11   4696   ±èÇö¿ì
2006-12   4696   ¼ÒÇöÁØ
2008-11   4696   ¹Î¼ö¿µ
2007-05   4696   ¼­¼öºÀ
2018-08   4696   ±è°Ç¿ì
2013-11   4696   ¹Ú¹®Çü
2020-06   4696   ¾ÖÇÃÁÁ¾Æ
2015-10   4696   rainyday
2016-10   4696   ŵ°íÀ×
2006-10   4696   °ûÅ¿µ
2016-12   4696   Çϱվƺü
2014-06   4696   À׿©
2007-03   4696   ³ë¼®ÈÆ
2016-07   4696   ¾¾Çü
2014-06   4696   ¹Ì¼ö¸Ç
2015-09   4696   ±èÀº¸ñ