Coro::Util - various utility functions.
use Coro::Util;
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.
Works almost exactly like its AnyEvent::Socket counterpart, except that it does not block other coroutines and returns the results.
Work similarly to their perl counterparts, but do not block. Uses
Anyevent::Util::inet_aton
internally.
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";
Marc Lehmann <schmorp@schmorp.de> http://home.schmorp.de/