---
name: "Coro::Select"
section: "3pm"
platform: "linux"
package: "libcoro-perl"
version: "6.570-4"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Coro::Select"
---

# Coro::Select(3pm)

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

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

## BUGS

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

## SEE ALSO

Coro::LWP.

## AUTHOR/SUPPORT/CONTACT

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