안녕하세요...
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 에대해 잘모르는 상태에서 보려니 뭔가 시행착오가 많네요 ㅠㅠ
감사합니다.