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

e5472   
   Á¶È¸ 4054   Ãßõ 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 1952/5660
2015-12   1421394   ¹é¸Þ°¡
2014-05   4882239   Á¤ÀºÁØ1
2016-07   4053   ±èÁØÀ¯
2017-03   4053   ±èÁöÈÆ83
2014-01   4053   º´¸ÀÆù
2015-01   4053   inquisitive
2019-09   4053   ¸í¶û
2022-04   4053   Ȧ¸¯0o0
2019-08   4053   ¹Î»çÀå
2016-04   4053   ¿­Ç÷¾×¼Ç°¡¸é
2016-12   4053   ½½·çÇÁ
2015-01   4053   ¿µÈ¥Ãµ»ç
2021-01   4053   VSPress
2017-03   4054   ÇູÇϼ¼
2014-01   4054   Sunrise
2017-03   4054   Ä¡ºñ¶óºÎ
2017-04   4054   â¿øÀÚ°ÔÀÌ
2015-01   4054   Tori
2018-05   4054   ±¼··¼è
2015-05   4054   Win31
2014-12   4054   À̼±±Ô
2017-01   4054   orustd