NAME
Coro::Util - various utility functions.
SYNOPSIS
use Coro::Util;
DESCRIPTION
This module implements various utility functions, mostly replacing perl functions by non-blocking counterparts.
This module is an AnyEvent user. Refer to the AnyEvent documentation to see how to integrate it into your own programs.
- $ipn = Coro::Util::inet_aton $hostname || $ip
-
Works almost exactly like its AnyEvent::Socket counterpart, except that it does not block.
- gethostbyname, gethostbyaddr
-
Work similarly to their perl counterparts, but do not block. Uses
Anyevent::Util::inet_aton
internally. - @result = Coro::Util::fork_eval { ... }, @args
-
Executes the given code block or code reference with the given arguments in a separate process, returning the results. The return values must be serialisable with Coro::Storable. It may, of course, block.
Note that using event handling in the sub is not usually a good idea as you will inherit a mixed set of watchers from the parent.
Exceptions will be correctly forwarded to the caller.
This function is useful for pushing cpu-intensive computations into a different process, for example to take advantage of multiple CPU's. Its also useful if you want to simply run some blocking functions (such as
system()
) and do not care about the overhead enough to code your own pid watcher etc.This function might keep a pool of processes in some future version, as fork can be rather slow in large processes.
Example: execute some external program (convert image to rgba raw form) and add a long computation (extract the alpha channel) in a separate process, making sure that never more then $NUMCPUS processes are being run.
my $cpulock = new Coro::Semaphore $NUMCPUS; sub do_it { my ($path) = @_; my $guard = $cpulock->guard; Coro::Util::fork_eval { open my $fh, "convert -depth 8 \Q$path\E rgba:" or die "$path: $!"; local $/; # make my eyes hurt pack "C*", unpack "(xxxC)*", <$fh> } } my $alphachannel = do_it "/tmp/img.png";
AUTHOR
Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/