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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.