# `select` — I/O 완료 대기

이 모듈은 대부분의 운영 체제에서 사용 가능한 `select()`와 `poll()` 함수, Solaris와 파생 제품에서 사용 가능한 `devpoll()`, 리눅스 2.5+ 에서 사용 가능한 `epoll()` 및 대부분의 BSD에서 사용 가능한 `kqueue()`에 대한 액세스를 제공합니다. 윈도우에서는 소켓에서만 작동함에 유의하십시오; 다른 운영 체제에서는, 다른 파일 유형에서도 작동합니다 (특히, 유닉스에서는 파이프에서도 작동합니다). 일반 파일에서 파일을 마지막으로 읽은 이후에 파일이 커졌는지를 판별하기 위해 사용할 수는 없습니다.

참고

The `selectors` module allows high-level and efficient I/O multiplexing, built upon the `select` module primitives. Users are encouraged to use the `selectors` module instead, unless they want precise control over the OS-level primitives used.

가용성: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내용은 웹어셈블리 플랫폼을 참조하세요.

모듈은 다음을 정의합니다:

exception select.error

  `OSError`의 폐지된 별칭.

  버전 3.3에서 변경: PEP 3151에 따라, 이 클래스는 `OSError`의 별칭이 되었습니다.

select.devpoll()

  Returns a `/dev/poll` polling object; see section /dev/poll polling objects below for the methods supported by devpoll objects.

  `devpoll()` 객체는 인스턴스 화 시점에 허용되는 파일 기술자 수에 연결됩니다. 프로그램이 이 값을 줄이면, `devpoll()`이 실패합니다. 프로그램이 이 값을 늘리면, `devpoll()`은 불완전한 활성 파일 기술자 리스트를 반환할 수 있습니다.

  새 파일 기술자는 상속 불가능합니다.

  Added in version 3.3.

  버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

  가용성: Solaris.

select.epoll(sizehint=-1, flags=0)

  Return an edge polling object, which can be used as Edge or Level Triggered interface for I/O events.

  sizehint informs epoll about the expected number of events to be registered. It must be positive, or `-1` to use the default. It is only used on older systems where epoll_create1(2) is not available; otherwise it has no effect (though its value is still checked).

  flags는 폐지되었고 완전히 무시됩니다. 그러나, 제공되면, 값은 `0`이나 `select.EPOLL_CLOEXEC`여야 합니다. 그렇지 않으면 `OSError`가 발생합니다.

  epolling 객체가 지원하는 메서드는 아래의 Edge and level trigger polling (epoll) objects 섹션을 참조하십시오.

  `epoll` 객체는 컨텍스트 관리자 프로토콜을 지원합니다: `with` 문에서 사용될 때, 새 파일 기술자는 블록 끝에서 자동으로 닫힙니다.

  새 파일 기술자는 상속 불가능합니다.

  버전 3.3에서 변경: flags 매개 변수를 추가했습니다.

  버전 3.4에서 변경: `with` 문에 대한 지원이 추가되었습니다. 새로운 파일 기술자는 이제 상속 불가능합니다.

  버전 3.4부터 폐지됨: flags 매개 변수. 이제 기본적으로 `select.EPOLL_CLOEXEC`가 사용됩니다. 파일 기술자를 상속 가능하게 하려면 `os.set_inheritable()`을 사용하십시오.

  버전 3.15에서 변경: When CPython is built, this function may be disabled using `--disable-epoll`.

  가용성: Linux >= 2.5.44.

select.poll()

  Returns a polling object, which supports registering and unregistering file descriptors, and then polling them for I/O events; see section Polling objects below for the methods supported by polling objects.

  가용성: Unix.

select.kqueue()

  Returns a kernel queue object; see section Kqueue objects below for the methods supported by kqueue objects.

  새 파일 기술자는 상속 불가능합니다.

  버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

  가용성: BSD, macOS.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

  Returns a kernel event object; see section Kevent objects below for the methods supported by kevent objects.

  가용성: BSD, macOS.

select.select(rlist, wlist, xlist, timeout=None)

  이것은 유닉스 `select()` 시스템 호출에 대한 간단한 인터페이스입니다. 처음 세 개의 인자는 ‘대기 가능한 객체(waitable objects)’의 이터러블입니다: 대기 가능한 객체는 파일 기술자를 나타내는 정수나 그런 정수를 반환하는 `fileno()`라는 매개 변수 없는 메서드를 가진 객체입니다:

  - rlist: 읽을 준비가 될 때까지 기다립니다

  - wlist: 쓰기 준비가 될 때까지 기다립니다

  - xlist: “예외 조건”을 기다립니다 (시스템에서 어떤 것들을 이러한 조건으로 간주하는지는 매뉴얼 페이지를 참조하십시오)

  Empty iterables are allowed, but acceptance of three empty iterables is platform-dependent. (It is known to work on Unix but not on Windows.) The optional timeout argument specifies a time-out in seconds; it may be a non-integer to specify fractions of seconds. When the timeout argument is omitted or `None`, the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks.

  반환 값은 준비된 객체의 리스트 3개입니다: 처음 세 인자의 부분 집합입니다. 파일 기술자가 준비되지 않고 시간제한에 도달하면, 세 개의 빈 리스트가 반환됩니다.

  이터러블에서 허용되는 객체 형에는 파이썬 파일 객체 (예를 들어 `sys.stdin`, 또는 `open()`이나 `os.popen()`에서 반환된 객체), `socket.socket()`에서 반환된 소켓 객체가 있습니다. 적절한 (단지 임의의 정수가 아니라 실제 파일 기술자를 반환하는) `fileno()` 메서드가 있는 한, 래퍼 (wrapper) 클래스를 직접 정의할 수도 있습니다.

  참고

  윈도우에서 파일 객체는 허용되지 않지만, 소켓은 허용됩니다. 윈도우에서, 하부 `select()` 함수는 WinSock 라이브러리에서 제공되며, WinSock에서 생성되지 않은 파일 기술자를 처리하지 않습니다.

  버전 3.5에서 변경: 시그널 처리기가 `InterruptedError`를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

  버전 3.15에서 변경: Accepts any real number as timeout, not only integer or float.

select.PIPE_BUF

  The minimum number of bytes which can be written without blocking to a pipe when the pipe has been reported as ready for writing by `select()`, `poll()` or another interface in this module. This doesn’t apply to other kinds of file-like objects such as sockets.

  이 값은 POSIX에서 512 이상이 되도록 보장합니다.

  가용성: Unix

  Added in version 3.2.

## `/dev/poll` polling objects

Solaris와 파생 제품에는 `/dev/poll`이 있습니다. `select()`는 O(가장 높은 파일 기술자)이고 `poll()`은 O(파일 기술자 수)이지만 `/dev/poll`은 O(활성 파일 기술자)입니다.

`/dev/poll` 동작은 표준 `poll()` 객체에 매우 가깝습니다.

devpoll.close()

  폴링 객체의 파일 기술자를 닫습니다.

  Added in version 3.4.

devpoll.closed

  폴링 객체가 닫혔으면 `True`.

  Added in version 3.4.

devpoll.fileno()

  폴링 객체의 파일 기술자 번호를 반환합니다.

  Added in version 3.4.

devpoll.register(fd[, eventmask])

  폴링 객체에 파일 기술자를 등록합니다. 이후 `poll()` 메서드에 대한 호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. fd는 정수이거나, 정수를 반환하는 `fileno()` 메서드가 있는 객체일 수 있습니다. 파일 객체는 `fileno()`를 구현하므로, 인자로도 사용할 수 있습니다.

  eventmask is an optional bitmask describing the type of events you want to check for. The constants are the same as with `poll()` object. The default value is a combination of the constants `POLLIN`, `POLLPRI`, and `POLLOUT`.

  경고

  이미 등록된 파일 기술자를 등록하는 것은 에러가 아니지만, 결과는 정의되지 않습니다. 적절한 액션은 먼저 unregister 하거나 modify 하는 것입니다. 이것은 `poll()`과 비교하여 중요한 차이점입니다.

devpoll.modify(fd[, eventmask])

  This method does an `unregister()` followed by a `register()`. It is (a bit) more efficient than doing the same explicitly.

devpoll.unregister(fd)

  폴링 객체가 추적하는 파일 기술자를 제거합니다. `register()` 메서드와 마찬가지로, fd는 정수이거나 정수를 반환하는 `fileno()` 메서드가 있는 객체일 수 있습니다.

  등록되지 않은 파일 기술자를 제거하려고 하면 안전하게 무시됩니다.

devpoll.poll([timeout])

  등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기술자에 대한 `(fd, event)` 2-튜플이 포함된 비어있을 수 있는 리스트를 반환합니다. fd는 파일 기술자이고, event는 해당 기술자에 대해 보고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 — 대기 중인 입력은 `POLLIN`, 기술자에 쓸 수 있음을 나타내는 데는 `POLLOUT`, 등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일 기술자가 없음을 나타냅니다. timeout이 제공되면, 시스템이 반환하기 전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. timeout을 생략하거나 -1이거나 `None`이면, 이 폴링 객체에 대한 이벤트가 있을 때까지 호출이 블록 됩니다.

  버전 3.5에서 변경: 시그널 처리기가 `InterruptedError`를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

  버전 3.15에서 변경: Accepts any real number as timeout, not only integer or float.

## Edge and level trigger polling (epoll) objects

> https://linux.die.net/man/4/epoll

> The eventmask is a bit mask using the following constants:

> 상수 | 의미
> --- | ---
> `EPOLLIN` | Available for read.
> `EPOLLOUT` | Available for write.
> `EPOLLPRI` | Urgent data for read.
> `EPOLLERR` | Error condition happened on the associated fd.
> `EPOLLHUP` | Hang up happened on the associated fd.
> `EPOLLET` | Set Edge Trigger behavior, the default is Level Trigger behavior.
> `EPOLLONESHOT` | Set one-shot behavior. After one event is pulled out, the fd is internally disabled.
> `EPOLLEXCLUSIVE` | Wake only one epoll object when the associated fd has an event. The default (if this flag is not set) is to wake all epoll objects polling on an fd.
> `EPOLLRDHUP` | 스트림 소켓 반대편이 연결을 닫았거나 연결의 쓰기 절반을 종료했습니다.
> `EPOLLRDNORM` | `EPOLLIN`과 동등합니다
> `EPOLLRDBAND` | 우선순위가 높은 데이터 대역을 읽을 수 있습니다.
> `EPOLLWRNORM` | Equivalent to `EPOLLOUT`.
> `EPOLLWRBAND` | 우선순위가 높은 데이터를 쓸 수 있습니다.
> `EPOLLMSG` | 무시됩니다.
> `EPOLLWAKEUP` | Prevents sleep during event waiting.

> Added in version 3.6: `EPOLLEXCLUSIVE`가 추가되었습니다. 리눅스 커널 4.5 이상에서만 지원됩니다.

> Added in version 3.14: `EPOLLWAKEUP` was added. It’s only supported by Linux Kernel 3.5 or later.

epoll.close()

  epoll 객체의 제어 파일 기술자를 닫습니다.

epoll.closed

  epoll 객체가 닫혔으면 `True`.

epoll.fileno()

  제어 fd의 파일 기술자 번호를 반환합니다.

epoll.fromfd(fd)

  주어진 파일 기술자에서 epoll 객체를 만듭니다.

epoll.register(fd[, eventmask])

  Register a file descriptor fd with the epoll object.

epoll.modify(fd, eventmask)

  Modify a registered file descriptor fd.

epoll.unregister(fd)

  epoll 객체에서 등록된 파일 기술자를 제거합니다.

  버전 3.9에서 변경: 이 메서드는 더는 `EBADF` 에러를 무시하지 않습니다.

epoll.poll(timeout=None, maxevents=-1)

  Wait for events. If timeout is given, it specifies the length of time in seconds (may be non-integer) which the system will wait for events before returning.

  버전 3.5에서 변경: 시그널 처리기가 `InterruptedError`를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

  버전 3.15에서 변경: Accepts any real number as timeout, not only integer or float.

## Polling objects

대부분의 유닉스 시스템에서 지원되는 `poll()` 시스템 호출은 동시에 많은 클라이언트에게 서비스를 제공하는 네트워크 서버에 더 나은 확장성을 제공합니다. `select()`는 비트맵을 빌드하고, 관심 있는 fd에 대한 비트를 켠 후, 전체 비트 맵을 다시 선형으로 스캔해야 하지만, 이 시스템 호출은 관심 있는 파일 기술자만 나열하면 되기 때문에 `poll()`은 더 잘 확장됩니다. `select()`는 O(가장 높은 파일 기술자)이고 `poll()`은 O(파일 기술자 수)입니다.

poll.register(fd[, eventmask])

  폴링 객체에 파일 기술자를 등록합니다. 이후 `poll()` 메서드에 대한 호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. fd는 정수이거나, 정수를 반환하는 `fileno()` 메서드가 있는 객체일 수 있습니다. 파일 객체는 `fileno()`를 구현하므로, 인자로도 사용할 수 있습니다.

  eventmask는 확인할 이벤트 유형을 설명하는 선택적 비트 마스크이고, 아래 표에 설명된 상수 `POLLIN`, `POLLPRI` 및 `POLLOUT`의 조합일 수 있습니다. 지정하지 않으면, 사용되는 기본값은 3가지 유형의 이벤트를 모두 확인합니다.

  상수 | 의미
  --- | ---
  `POLLIN` | There is data to read.
  `POLLPRI` | There is urgent data to read.
  `POLLOUT` | Ready for output: writing will not block.
  `POLLERR` | Error condition of some sort.
  `POLLHUP` | Hung up.
  `POLLRDHUP` | Stream socket peer closed connection, or shut down writing half of connection.
  `POLLNVAL` | Invalid request: descriptor not open.

  이미 등록된 파일 기술자를 등록하는 것은 에러가 아니며, 기술자를 정확히 한 번 등록하는 것과 같은 효과가 있습니다.

poll.modify(fd, eventmask)

  이미 등록된 fd를 수정합니다. 이것은 `register(fd, eventmask)`와 같은 효과가 있습니다. 등록되지 않은 파일 기술자를 수정하려고 하면 errno `ENOENT`로 `OSError` 예외가 발생합니다.

poll.unregister(fd)

  폴링 객체가 추적하는 파일 기술자를 제거합니다. `register()` 메서드와 마찬가지로, fd는 정수이거나 정수를 반환하는 `fileno()` 메서드가 있는 객체일 수 있습니다.

  등록되지 않은 파일 기술자를 제거하려고 하면 `KeyError` 예외가 발생합니다.

poll.poll([timeout])

  등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기술자에 대한 `(fd, event)` 2-튜플이 포함된 비어있을 수 있는 리스트를 반환합니다. fd는 파일 기술자이고, event는 해당 기술자에 대해 보고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 — 대기 중인 입력은 `POLLIN`, 기술자에 쓸 수 있음을 나타내는 데는 `POLLOUT`, 등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일 기술자가 없음을 나타냅니다. timeout이 제공되면, 시스템이 반환하기 전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. timeout을 생략하거나 음수이거나 `None`이면, 이 폴링 객체에 대한 이벤트가 있을 때까지 호출이 블록 됩니다.

  버전 3.5에서 변경: 시그널 처리기가 `InterruptedError`를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

  버전 3.15에서 변경: Accepts any real number as timeout, not only integer or float. If `ppoll()` function is available, timeout has a resolution of `1` ns (`1e-6` ms) instead of `1` ms.

## Kqueue objects

kqueue.close()

  kqueue 객체의 제어 파일 기술자를 닫습니다.

kqueue.closed

  kqueue 객체가 닫혔으면 `True`.

kqueue.fileno()

  제어 fd의 파일 기술자 번호를 반환합니다.

kqueue.fromfd(fd)

  주어진 파일 기술자에서 kqueue 객체를 만듭니다.

kqueue.control(changelist, max_events[, timeout]) → eventlist

  kevent에 대한 저수준 인터페이스

  - changelist는 kevent 객체의 이터러블 이거나 `None`이어야 합니다

  - max_events는 0이거나 양의 정수여야 합니다.

  - timeout in seconds (non-integers are possible); the default is `None`, to wait forever

  버전 3.5에서 변경: 시그널 처리기가 `InterruptedError`를 발생시키는 대신 예외를 발생시키는 경우(이유는 PEP 475를 참조하십시오)를 제외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수가 다시 시도됩니다.

  버전 3.15에서 변경: Accepts any real number as timeout, not only integer or float.

## Kevent objects

https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

  이벤트를 식별하는 데 사용되는 값. 해석은 필터에 따라 다르지만, 일반적으로 파일 기술자입니다. 생성자에서 ident 는 정수이거나 `fileno()` 메서드가 있는 객체일 수 있습니다. kevent는 내부적으로 정수를 저장합니다.

kevent.filter

  커널 필터의 이름.

  상수 | 의미
  --- | ---
  `KQ_FILTER_READ` | Takes a descriptor and returns whenever there is data available to read.
  `KQ_FILTER_WRITE` | Takes a descriptor and returns whenever there is data available to write.
  `KQ_FILTER_AIO` | AIO requests.
  `KQ_FILTER_VNODE` | Returns when one or more of the requested events watched in fflag occurs.
  `KQ_FILTER_PROC` | Watch for events on a process ID.
  `KQ_FILTER_NETDEV` | Watch for events on a network device (not available on macOS).
  `KQ_FILTER_SIGNAL` | Returns whenever the watched signal is delivered to the process.
  `KQ_FILTER_TIMER` | Establishes an arbitrary timer.

kevent.flags

  필터 액션.

  상수 | 의미
  --- | ---
  `KQ_EV_ADD` | Adds or modifies an event.
  `KQ_EV_DELETE` | Removes an event from the queue.
  `KQ_EV_ENABLE` | Permits control() to return the event.
  `KQ_EV_DISABLE` | Disables event.
  `KQ_EV_ONESHOT` | Removes event after first occurrence.
  `KQ_EV_CLEAR` | Reset the state after an event is retrieved.
  `KQ_EV_SYSFLAGS` | Internal event.
  `KQ_EV_FLAG1` | Internal event.
  `KQ_EV_EOF` | Filter-specific EOF condition.
  `KQ_EV_ERROR` | See return values.

kevent.fflags

  Filter-specific flags.

  `KQ_FILTER_READ`와 `KQ_FILTER_WRITE` 필터 플래그:

  상수 | 의미
  --- | ---
  `KQ_NOTE_LOWAT` | Low water mark of a socket buffer.

  `KQ_FILTER_VNODE` 필터 플래그:

  상수 | 의미
  --- | ---
  `KQ_NOTE_DELETE` | unlink() was called.
  `KQ_NOTE_WRITE` | A write occurred.
  `KQ_NOTE_EXTEND` | The file was extended.
  `KQ_NOTE_ATTRIB` | An attribute was changed.
  `KQ_NOTE_LINK` | The link count has changed.
  `KQ_NOTE_RENAME` | The file was renamed.
  `KQ_NOTE_REVOKE` | Access to the file was revoked.

  `KQ_FILTER_PROC` 필터 플래그:

  상수 | 의미
  --- | ---
  `KQ_NOTE_EXIT` | The process has exited.
  `KQ_NOTE_FORK` | The process has called fork().
  `KQ_NOTE_EXEC` | The process has executed a new process.
  `KQ_NOTE_PCTRLMASK` | Internal filter flag.
  `KQ_NOTE_PDATAMASK` | Internal filter flag.
  `KQ_NOTE_TRACK` | Follow a process across fork().
  `KQ_NOTE_CHILD` | Returned on the child process for NOTE_TRACK.
  `KQ_NOTE_TRACKERR` | Unable to attach to a child.

  `KQ_FILTER_NETDEV` 필터 플래그 (맥 OS에서는 사용할 수 없습니다):

  상수 | 의미
  --- | ---
  `KQ_NOTE_LINKUP` | Link is up.
  `KQ_NOTE_LINKDOWN` | Link is down.
  `KQ_NOTE_LINKINV` | Link state is invalid.

kevent.data

  Filter-specific data.

kevent.udata

  User-defined value.