Job data is passed to workers by making a shared clone of it. Cloning a shared variable is causing the problem.
Solution that keeps data shared:
use threads;
use threads::shared;
use Data::Dumper qw( Dumper );
use Thread::Pool::Simple qw( );
my $state :shared = shared_clone({test1 => {test1 => 123}, test2 => {t
+est2 => 'abc'}});
sub worker {
my ($id) = @_;
my $data = $state->{$id};
print "Got Data: ".Dumper($data);
return { success => 1 };
}
{
my $tp = Thread::Pool::Simple->new(min => 1, max => 10, do => [ \&
+worker ]);
my $id1 = $tp->add('test1');
my $id2 = $tp->add('test2');
print "return 1: ".Dumper($tp->remove($id1));
print "return 2: ".Dumper($tp->remove($id2));
}
Solution that avoids globals:
use threads;
use threads::shared;
use Data::Dumper qw( Dumper );
use Thread::Pool::Simple qw( );
sub worker {
my ($data) = @_;
print "Got Data: ".Dumper($data);
return { success => 1 };
}
{
my $state = {test1 => {test1 => 123}, test2 => {test2 => 'abc'}};
my $tp = Thread::Pool::Simple->new(min => 1, max => 10, do => [ \&
+worker ]);
my $id1 = $tp->add($state->{'test1'});
my $id2 = $tp->add($state->{'test2'});
print "return 1: ".Dumper($tp->remove($id1));
print "return 2: ".Dumper($tp->remove($id2));
}