NAME
Coro::Select - a (slow but coro-aware) replacement for CORE::select
SYNOPSIS
use Coro::Select; # replace select globally (be careful, see below)
use Core::Select 'select'; # only in this module
use Coro::Select (); # use Coro::Select::select
DESCRIPTION
This module tries to create a fully working replacement for perl's select
built-in, using AnyEvent
watchers to do the job, so other coroutines can run in parallel to any select user. As many libraries that only have a blocking API do not use global variables and often use select (or IO::Select), this effectively makes most such libraries "somewhat" non-blocking w.r.t. other coroutines.
To be effective globally, this module must be use
'd before any other module that uses select
, so it should generally be the first module use
'd in the main program. Note that overriding select
globally might actually cause problems, as some AnyEvent
backends use select
themselves, and asking AnyEvent to use Coro::Select, which in turn asks AnyEvent will not quite work.
You can also invoke it from the commandline as perl -MCoro::Select
.
To override select only for a single module (e.g. Net::DBus::Reactor
), use a code fragment like this to load it:
{
package Net::DBus::Reactor;
use Coro::Select qw(select);
use Net::DBus::Reactor;
}
Performance naturally isn't great (every file descriptor must be dup'ed), but unless you need very high select performance you normally won't notice the difference.
This implementation works fastest when only very few bits are set in the fd set(s).
SEE ALSO
AUTHOR
Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/