in reply to Re: System call doesn't work when there is a large amount of data in a hash
in thread System call doesn't work when there is a large amount of data in a hash
Hi again,
I made an improved version including worker sending the error message. Replace system with syscmd in your script. That sends the command along with any arguments to the background worker. The worker receives the command to run and any arguments. The status and error message are sent to the main process after running the command.
syscmd:
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 { local $SIG{__WARN__} = sub {}; while ( my ($cmd, @args) = $chnl->recv ) { local ($?, $!); system($cmd, @args); $chnl->send2($?, $!); } }; sub syscmd { my $cmd = shift; return unless $cmd; $chnl->send($cmd, @_); my ($status, $errmsg) = $chnl->recv2; if ($status == -1) { print "SYSTEM: failed to execute ($cmd): $errmsg\n"; } elsif ($status & 127) { printf "SYSTEM: $cmd died with signal %s, %s coredump\n", ($status & 127), ($status & 128) ? 'with' : 'without'; } else { printf "SYSTEM: $cmd exited with status %d\n", $status >> 8; } } # create big hash my %big_hash; # pass command and optionally args syscmd('ls'); # attempt to run a command not found syscmd('something'); # sleep for 2 seconds syscmd('sleep', '2'); # notify no more work, then reap worker $chnl->end; MCE::Child->waitall;
output:
ls output from syscmd SYSTEM: ls exited with status 0 SYSTEM: failed to execute (something): No such file or directory SYSTEM: sleep exited with status 0
Regards, Mario
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^3: System call doesn't work when there is a large amount of data in a hash (testing)
by marioroy (Prior) on Apr 29, 2020 at 23:37 UTC | |
by Nicolasd (Acolyte) on May 01, 2020 at 00:33 UTC | |
by Nicolasd (Acolyte) on Apr 30, 2020 at 00:44 UTC | |
by Nicolasd (Acolyte) on Apr 30, 2020 at 00:19 UTC | |
by marioroy (Prior) on Apr 30, 2020 at 00:43 UTC |