logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Coro::Select - a (slow but coro-aware) replacement for CORE::select

Author/Support/Contact

          Marc A. Lehmann <schmorp@schmorp.de>
          http://software.schmorp.de/pkg/Coro.html

perl v5.40.1                                       2025-03-21                                        Select(3pm)

Bugs

       For performance reasons, Coro::Select's select function might not properly detect bad file descriptors
       (but relying on EBADF is inherently non-portable).

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 threads 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 threads.

       This implementation works fastest when only very few bits are set in the fd set(s).

       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;
          }

       Some modules (notably POE::Loop::Select) directly call "CORE::select". For these modules, we need to
       patch the opcode table by sandwiching it between calls to "Coro::Select::patch_pp_sselect" and
       "Coro::Select::unpatch_pp_sselect":

        BEGIN {
           use Coro::Select ();
           Coro::Select::patch_pp_sselect;
           require evil_poe_module_using_CORE::SELECT;
           Coro::Select::unpatch_pp_sselect;
        }

Name

       Coro::Select - a (slow but coro-aware) replacement for CORE::select

See Also

       Coro::LWP.

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

See Also