package myQueue; use strictures 1; use autodie qw/:all/; use Devel::SimpleTrace; use threads qw/yield/; use Thread::Queue; sub new { use strict qw/refs/; use warnings; my $class = shift(); my (@params) = shift @_; return bless(@params, $class); } sub work { use strict qw/refs/; use warnings; my($pool) = shift @_; while ( my (@args) = shift @{ $$pool{'workQueue'}; } ) { print "ID=" . threads->self()->tid() . " : WorkQueue = " . @{ $$pool{'workQueue'}; }; my($code) = shift @args; &$code(@args); } } sub start { use strict qw/refs/; use warnings; my($pool) = shift(); return if $$pool{'jobs'}; push @{ $$pool{'workQueue'}; }, (undef) x $$pool{'maxThreads'}; @{ $$pool{'jobs'}; } = map( { threads->create( \&work, $pool ); } 1 .. $$pool{'maxThreads'} ); } sub enqueue { use strict qw/refs/; use warnings; my ( $pool, $code, @args ) = @_; $code = caller() . "::$code" unless ref $code or $code =~ /::/; push @{ $$pool{'workQueue'}; }, [ $code, @args ]; } my $maxThreads = 5; my @args = @_; my $pool = Thread::Queue->new(\$maxThreads); $pool->enqueue($args[0], $args[1]); my $left = $pool->pending(); print "There are $left items waiting in the queue\n";
In reply to Re: Implementing Custom ThreadPool
by Khen1950fx
in thread Implementing Custom ThreadPool
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |