Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Error trying to dump a hash that is shared

by lost953 (Novice)
on Feb 14, 2018 at 03:55 UTC ( #1209101=perlquestion: print w/replies, xml ) Need Help??
lost953 has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to use Thread::Pool::Simple to manage a basic thread pool, but when I try to dump out the hashref I pass in with Data::Dumper::Dumper or Data::Dump::dump I get strange errors:

Can't locate object method "FETCH" via package "threads::shared::tie" +at .../opt/perl/lib/5.16.3/x86_64-linux-thread-multi/Data/Dumper.pm l +ine 190.

I've tried to "unshare" the by copying it using Clone::clone but that didn't change the result either.

Any thoughts on what to try next? Thanks.

Code to reproduce:

use strict; use warnings; use threads; use threads::shared; use Data::Dumper; use Thread::Pool::Simple; my $state :shared; $state = shared_clone({test1 => {test1 => 123}, test2 => {test2 => 'ab +c'}}); my $tp = Thread::Pool::Simple->new(min => 1, max => 10, do => [\&test] +); my $id1 = $tp->add($state->{test1}); my $id2 = $tp->add($state->{test2}); my $ret1= $tp->remove($id1); my $ret2= $tp->remove($id2); print "return 1: ".Dumper($ret1)."\n"; print "return 2: ".Dumper($ret2)."\n"; sub test { my ($data) = @_; print "Got Data: ".Dumper($data); return {succes => 1}; }

Replies are listed 'Best First'.
Re: Error trying to dump a hash that is shared
by ikegami (Pope) on Feb 14, 2018 at 08:06 UTC

    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)); }
      Thanks for the response. Is there any way to "unshare" the data before passing it into the ThreadPool so it can't get shared_cloned again. I tried cloning it but that didn't change the results.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1209101]
Approved by beech
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (12)
As of 2018-04-19 21:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?