NAME

AnyEvent::Run - Run a process or coderef asynchronously

SYNOPSIS

use AnyEvent;
use AnyEvent::Run;

my $cv = AnyEvent->condvar;

my $handle = AnyEvent::Run->new(
    cmd      => [ 'ls', '-l' ],
    priority => 19,              # optional nice value 
    on_read  => sub {
        my $handle = shift;
        ...
        $cv->send;
    },
    on_error  => sub {
        my ($handle, $fatal, $msg) = @_;
        ...
        $cv->send;
    },
);

# Send data to the process's STDIN
$handle->push_write($data);

$cv->recv;

DESCRIPTION

AnyEvent::Run is a subclass of AnyEvent::Handle, so reading it's documentation first is recommended.

This module is designed to run a child process, using an explicit command line, a class name, or a coderef. It should work on any Unix system as well as Windows 2000 and higher.

For an alternate way of running a coderef in a forked process using AnyEvent, see AnyEvent::Util's fork_call function.

METHODS

$handle = new( %args )

Creates and returns a new AnyEvent::Run object. The process forks and either execs (Unix) or launches a new process (Windows). If using a coderef, the coderef is run in the forked process.

The process's STDIN, STDOUT, and STDERR and connected to $handle->{fh}.

The child process is automatically killed if the AnyEvent::Run object goes out of scope.

See AnyEvent::Handle for additional parameters for new().

cmd

Required. Takes a string, an arrayref, or a code reference.

cmd => 'ps ax'
cmd => [ 'ps, 'ax' ]
cmd => sub { print "Hi, I'm $$\n" }

When launching an external command, using an arrayref is recommended so that your command is properly escaped.

Take care when using coderefs on Windows, as your code will run in a thread. Avoid using modules that are not thread-safe.

args

Optional. Arrayref of arguments to be passed to cmd.

class

Optional. Class name to be loaded in the child process. Using this method is a more efficient way to execute Perl code than by using a coderef. This will exec a new Perl interpreter, loading only this class, and will call that class's main() method.

my $handle = AnyEvent::Run->new(
    class => 'My::SubProcess',
    ...
);

package My::SubProcess;

sub main {
    print "Hi, I'm $$\n";
}

1;
method

Optional. When using class, instead of calling main(), the given method will be called.

priority

Optional. A numeric value between -19 and 19. On Unix, you must be root to change the priority to a value less than 0. On Windows, these values are mapped to the following priority levels:

-19 to -16  High
-15 to  -6  Above Normal
-5  to   4  Normal
 5  to  14  Below Normal
15  to  19  Idle

BUGS

AnyEvent::Handle's linger option is not supported.

Open file descriptors are not closed under Windows after forking.

THANKS

This module was based in part on POE::Wheel::Run and POE::Wheel::Run::Win32.

SEE ALSO

AnyEvent AnyEvent::Handle AnyEvent::Util

AUTHOR

Andy Grundman, <andy@hybridized.org>

COPYRIGHT AND LICENSE

This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself.