http://qs321.pair.com?node_id=11116227


in reply to System call doesn't work when there is a large amount of data in a hash

Hi Nicolasd,

One may spin up a worker early and communicate via a channel. The worker makes the system call and notifies once completed. The 'Simple' channel is specified due to just one background worker (i.e. no mutex locking needed). Otherwise, 'Mutex' is the default when not specified. Lastly, this works on Unix OSes and Windows.

Update: Pass back the status. See system on PerlDocs for how to inspect the status.
Update: Including error message.

use strict; use warnings; use MCE::Child; use MCE::Channel; my $chnl = MCE::Channel->new( impl => 'Simple' ); # spin up worker early before creating big hash mce_child { while ( my ($cmd, @args) = $chnl->recv ) { local ($?, $!); system($cmd, @args); $chnl->send2($?, $!); } }; # create big hash my %big_hash; my ($status, $errmsg); # pass command and optionally args to worker $chnl->send('ls'); ($status, $errmsg) = $chnl->recv2; # ditto, sleep for 2 seconds $chnl->send('sleep', '2'); ($status, $errmsg) = $chnl->recv2; # notify no more work, then reap worker $chnl->end; MCE::Child->waitall;

The background worker awaits for the next system call to make. Waiting involves no CPU time. No hash copy either because the worker is spun early.

See also Child in meta::cpan.

Regards, Mario