Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Proc::Simple store return from background process

by perldarren (Novice)
on Oct 11, 2012 at 15:47 UTC ( #998484=perlquestion: print w/ replies, xml ) Need Help??
perldarren has asked for the wisdom of the Perl Monks concerning the following question:

Hi everybody, I would really appreciate some help with Proc::Simple.

I would like to use Proc::Simple to push an object method into the background ( If that is the correct way to term what I am doing ).

The Proc::Simple docs are really good, they just don't have an example exactly like my situation so my stupidity has unstuck me very quickly.

This is my code:

my $status = $child_procs{$host}{proc}->start( sub { $return = + $hinst->evtwait( GROUP => $host_in_transit->{copy_grp} +->{copy_grp}, MODE => '22', STATE => 'good', TIMEOUT => '9999' ) } );


The trouble is that the process backgrounds nicely but I am unable to keep the value returned to $return. Any ideas how I can do this ?

Ultimately, I will run up to 5 of these processes in the background and will store the $return in a hash.

Thanks Everybody.

Regards,
Darren

Comment on Proc::Simple store return from background process
Download Code
Replies are listed 'Best First'.
Re: Proc::Simple store return from background process
by Perlbotics (Canon) on Oct 11, 2012 at 18:27 UTC

    Short answer: You cannot with Proc::Simple (longer: in your case when starting a sub{...} as a child process)

    This is what happens in the child part of the fork() that is executed for your $func = sub{...};

    # in Proc::Simple # $func = sub{ ... }; # your code ... if(ref($func) eq "CODE") { $self->dprt("Launching code"); $func->(@params); exit 0; # Start perl subroutine } else { ...
    So, the exit 0 (successful execution) is all that is returned from your sub{...}. The $return value is discarded.

    Your sub{...} could return the result to the main process by means of IPC or by storing the result in a temporary file (e.g. YAML, JSON, Storable, etc.). The parent process could read the result from a pipe or load the serialised data from a file after the sub has finished.
    Update: IPC::Lite

    However, I guess, that in this particular case, you're better off with threads and maybe a queue.

      Ok, I see.

      To get around this I made my routine physically exit with the return code I originally wanted to return.

      I can then read this as Proc::Simple intended using something like:
      my $exit = $child_procs{myhost}{proc}->exit_status(); my $exit_code = $exit >> 8;
      Thank you very much for your help.

      Regards, Darren

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://998484]
Front-paged by Arunbear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (12)
As of 2015-07-30 14:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (271 votes), past polls