select — I/O 완료 대기
select — I/O 완료 대기
이 모듈은 대부분의 운영 체제에서 사용할 수 있는 select()와 poll() 함수, Solaris 및 파생 제품에서 사용할 수 있는 devpoll(), Linux 2.5+에서 사용할 수 있는 epoll(), 대부분의 BSD에서 사용할 수 있는 kqueue()에 대한 접근을 제공합니다. Windows에서는 소켓에 대해서만 작동합니다. 다른 운영 체제에서는 다른 파일 유형에도 작동합니다(특히 Unix에서는 파이프에서 작동합니다). 마지막 읽기 이후 파일이 커졌는지 여부를 결정하기 위해 일반 파일에는 사용할 수 없습니다.
본문
Note
selectors모듈은 select 모듈 프리미티브 위에 구축된 고수준이고 효율적인 I/O 다중화를 허용합니다. 사용자는 OS 수준 프리미티브를 정밀하게 제어하려는 경우가 아니라면selectors모듈을 대신 사용하는 것이 좋습니다.
availability: not WASI.
이 모듈은 WebAssembly에서 작동하지 않거나 사용할 수 없습니다.
모듈은 다음을 정의합니다.
- select.error —
OSError의 폐기된 별칭.versionchanged: 3.3에서 PEP 3151에 따라 이 클래스는
OSError의 별칭이 되었습니다. - select.devpoll() —
/dev/poll폴링 객체를 반환합니다. devpoll 객체가 지원하는 메서드에 대해서는 아래의 /dev/poll 폴링 객체 섹션을 참고하세요.devpoll()객체는 인스턴스화 시 허용되는 파일 디스크립터 수에 연결됩니다. 프로그램이 이 값을 줄이면devpoll()이 실패합니다. 프로그램이 이 값을 늘리면devpoll()은 활성 파일 디스크립터의 불완전한 목록을 반환할 수 있습니다.- 새 파일 디스크립터는 상속 불가(non-inheritable)입니다.
-
versionadded: 3.3.
-
versionchanged: 3.4에서 새 파일 디스크립터는 이제 상속 불가합니다.
- Availability: Solaris.
- select.epoll(sizehint=-1, flags=0) — 에지 또는 레벨 트리거 인터페이스로 I/O 이벤트에 사용할 수 있는 에지 폴링 객체를 반환합니다.
sizehint는 등록될 것으로 예상되는 이벤트 수를 epoll에 알립니다. 양수이거나 기본값을 사용하려면 -1이어야 합니다.epoll_create1()을 사용할 수 없는 오래된 시스템에서만 사용되며, 그렇지 않으면 효과가 없습니다(그 값은 여전히 검사되지만).flags는 폐기되었으며 완전히 무시됩니다. 단, 제공되면 그 값은 0 또는select.EPOLL_CLOEXEC이어야 하며, 그렇지 않으면OSError가 발생합니다.- epoll 객체가 지원하는 메서드에 대해서는 아래의 에지 및 레벨 트리거 폴링(epoll) 객체 섹션을 참고하세요.
- epoll 객체는 컨텍스트 관리 프로토콜을 지원합니다:
with문에서 사용하면 블록 끝에서 새 파일 디스크립터가 자동으로 닫힙니다. - 새 파일 디스크립터는 상속 불가입니다.
-
versionchanged: 3.3에서
flags매개변수가 추가되었습니다. -
versionchanged: 3.4에서
with문 지원이 추가되었고 새 파일 디스크립터는 이제 상속 불가합니다. -
deprecated: 3.4부터
flags매개변수.select.EPOLL_CLOEXEC이 이제 기본적으로 사용됩니다. 파일 디스크립터를 상속 가능하게 하려면os.set_inheritable()을 사용하세요. - Availability: Linux >= 2.5.44.
- select.poll() — 파일 디스크립터 등록 및 등록 해제를 지원하고 I/O 이벤트에 대해 폴링하는 폴링 객체를 반환합니다. 폴링 객체가 지원하는 메서드에 대해서는 아래의 폴링 객체 섹션을 참고하세요.
- Availability: Unix.
- select.kqueue() — 커널 큐 객체를 반환합니다. kqueue 객체가 지원하는 메서드에 대해서는 아래의 Kqueue 객체 섹션을 참고하세요.
- 새 파일 디스크립터는 상속 불가입니다.
-
versionchanged: 3.4에서 새 파일 디스크립터는 이제 상속 불가합니다.
- Availability: BSD, macOS.
- select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0) — 커널 이벤트 객체를 반환합니다. kevent 객체가 지원하는 메서드에 대해서는 아래의 Kevent 객체 섹션을 참고하세요.
- Availability: BSD, macOS.
- select.select(rlist, wlist, xlist, timeout=None) — 이것은 Unix
select()시스템 호출에 대한 간단한 인터페이스입니다. 처음 세 인자는 '대기 가능한 객체(waitable objects)'의 iterable입니다: 파일 디스크립터를 나타내는 정수이거나 그런 정수를 반환하는fileno()라는 매개변수 없는 메서드를 가진 객체입니다.rlist: 읽기 준비가 될 때까지 대기wlist: 쓰기 준비가 될 때까지 대기xlist: "예외 조건(exceptional condition)"을 대기(시스템이 그러한 조건으로 간주하는 것이 무엇인지는 매뉴얼 페이지 참고)- 빈 iterable은 허용되지만 세 개의 빈 iterable을 수락하는지는 플랫폼에 따라 다릅니다. (Unix에서는 작동하는 것으로 알려져 있지만 Windows에서는 작동하지 않습니다.) 선택적
timeout인자는 초 단위의 부동소수점 수로 타임아웃을 지정합니다.timeout인자가 생략되거나None이면 함수는 적어도 하나의 파일 디스크립터가 준비될 때까지 블록합니다. 0의 타임아웃 값은 폴링을 지정하며 결코 블록하지 않습니다. - 반환 값은 준비된 객체 목록의 3중 튜플입니다: 처음 세 인자의 하위 집합. 파일 디스크립터가 준비되지 않고 타임아웃에 도달하면 세 개의 빈 목록이 반환됩니다.
- iterable에서 허용되는 객체 유형 중에는 Python 파일 객체(예:
sys.stdin, 또는open()이나os.popen()이 반환하는 객체),socket.socket()이 반환하는 소켓 객체가 있습니다. 또한 적절한fileno()메서드(실제 파일 디스크립터를 반환하는, 임의 정수가 아닌)만 있으면 래퍼 클래스를 직접 정의할 수도 있습니다. -
Note Windows의 파일 객체는 허용되지 않지만 소켓은 허용됩니다. Windows에서 기저
select()함수는 WinSock 라이브러리에서 제공하며 WinSock에서 유래하지 않은 파일 디스크립터는 처리하지 않습니다. -
versionchanged: 3.5에서 함수는
InterruptedError를 발생시키는 대신 시그널에 의해 중단되면 재계산된 타임아웃으로 재시도됩니다(시그널 핸들러가 예외를 발생시키지 않는 한, 근거는 PEP 475 참고).
- select.PIPE_BUF — 파이프가
select(),poll()또는 이 모듈의 다른 인터페이스에 의해 쓰기 준비로 보고되었을 때 블록 없이 파이프에 쓸 수 있는 최소 바이트 수. 소켓과 같은 다른 종류의 file-like 객체에는 적용되지 않습니다.- 이 값은 POSIX가 적어도 512임을 보장합니다.
- Availability: Unix.
-
versionadded: 3.2.
/dev/poll 폴링 객체
Solaris와 파생 제품에는 /dev/poll이 있습니다. select()가 O(가장 높은 파일 디스크립터)이고 poll()이 O(파일 디스크립터 수)인 반면, /dev/poll은 O(활성 파일 디스크립터)입니다.
/dev/poll 동작은 표준 poll() 객체와 매우 가깝습니다.
- devpoll.close() — 폴링 객체의 파일 디스크립터를 닫습니다.
versionadded: 3.4.
- devpoll.closed — 폴링 객체가 닫히면
True.versionadded: 3.4.
- devpoll.fileno() — 폴링 객체의 파일 디스크립터 번호를 반환합니다.
versionadded: 3.4.
- devpoll.register(fd[, eventmask]) — 폴링 객체에 파일 디스크립터를 등록합니다. 이후
poll()메서드 호출은 파일 디스크립터에 대기 중인 I/O 이벤트가 있는지 확인합니다.fd는 정수이거나 정수를 반환하는fileno()메서드를 가진 객체일 수 있습니다. 파일 객체는fileno()를 구현하므로 인자로도 사용할 수 있습니다.eventmask는 확인하려는 이벤트 유형을 설명하는 선택적 비트마스크입니다. 상수는poll()객체와 같습니다. 기본값은POLLIN,POLLPRI,POLLOUT상수의 조합입니다.-
Warning 이미 등록된 파일 디스크립터를 등록하는 것은 오류가 아니지만 결과는 정의되지 않습니다. 적절한 조치는 먼저 등록 해제하거나 수정하는 것입니다. 이것은
poll()과 비교해 중요한 차이입니다.
- devpoll.modify(fd[, eventmask]) — 이 메서드는
unregister()다음에register()를 수행합니다. 같은 것을 명시적으로 수행하는 것보다 (약간) 더 효율적입니다. - devpoll.unregister(fd) — 폴링 객체가 추적하는 파일 디스크립터를 제거합니다.
register()메서드와 마찬가지로fd는 정수이거나 정수를 반환하는fileno()메서드를 가진 객체일 수 있습니다.- 등록된 적이 없는 파일 디스크립터를 제거하려는 시도는 안전하게 무시됩니다.
- devpoll.poll([timeout]) — 등록된 파일 디스크립터 집합을 폴링하고 보고할 이벤트나 오류가 있는 디스크립터에 대해
(fd, event)2-튜플을 포함하는, 아마도 빈 목록을 반환합니다.fd는 파일 디스크립터이고event는 해당 디스크립터에 대해 보고된 이벤트에 대해 비트가 설정된 비트마스크입니다 — 대기 입력은POLLIN, 디스크립터에 쓸 수 있음을 나타내려면POLLOUT등입니다. 빈 목록은 호출이 타임아웃되고 파일 디스크립터에 보고할 이벤트가 없었음을 나타냅니다.timeout이 주어지면 시스템이 반환하기 전에 이벤트를 기다릴 시간(밀리초)을 지정합니다.timeout이 생략되거나, -1이거나,None이면 이 poll 객체에 대한 이벤트가 있을 때까지 호출이 블록합니다.-
versionchanged: 3.5에서 함수는
InterruptedError를 발생시키는 대신 시그널에 의해 중단되면 재계산된 타임아웃으로 재시도됩니다(시그널 핸들러가 예외를 발생시키지 않는 한, 근거는 PEP 475 참고).
-
에지 및 레벨 트리거 폴링(epoll) 객체
https://linux.die.net/man/4/epoll
eventmask는 다음 상수를 사용하는 비트 마스크입니다.
| 상수 | 의미 |
|---|---|
| EPOLLIN | 읽기 가능. |
| EPOLLOUT | 쓰기 가능. |
| EPOLLPRI | 긴급 읽기 데이터. |
| EPOLLERR | 관련 fd에 오류 조건 발생. |
| EPOLLHUP | 관련 fd에 중단(hang up) 발생. |
| EPOLLET | 에지 트리거 동작 설정, 기본은 레벨 트리거 동작. |
| EPOLLONESHOT | One-shot 동작 설정. 하나의 이벤트가 추출된 후 fd는 내부적으로 비활성화됩니다. |
| EPOLLEXCLUSIVE | 관련 fd에 이벤트가 있을 때 하나의 epoll 객체만 깨웁니다. 기본(이 플래그가 설정되지 않은 경우)은 fd에서 폴링하는 모든 epoll 객체를 깨우는 것입니다. |
| EPOLLRDHUP | 스트림 소켓 피어가 연결을 닫았거나 연결의 쓰기 절반을 종료함. |
| EPOLLRDNORM | EPOLLIN과 동등. |
| EPOLLRDBAND | 우선 데이터 대역을 읽을 수 있음. |
| EPOLLWRNORM | EPOLLOUT과 동등. |
| EPOLLWRBAND | 우선 데이터를 쓸 수 있음. |
| EPOLLMSG | 무시됨. |
| EPOLLWAKEUP | 이벤트 대기 중 절전 방지. |
versionadded: 3.6에서
EPOLLEXCLUSIVE가 추가되었습니다. Linux 커널 4.5 이상에서만 지원됩니다.versionadded: 3.14에서
EPOLLWAKEUP이 추가되었습니다. Linux 커널 3.5 이상에서만 지원됩니다.
- epoll.close() — epoll 객체의 제어 파일 디스크립터를 닫습니다.
- epoll.closed — epoll 객체가 닫히면
True. - epoll.fileno() — 제어 fd의 파일 디스크립터 번호를 반환합니다.
- epoll.fromfd(fd) — 주어진 파일 디스크립터에서 epoll 객체를 만듭니다.
- epoll.register(fd[, eventmask]) — epoll 객체에 파일 디스크립터
fd를 등록합니다. - epoll.modify(fd, eventmask) — 등록된 파일 디스크립터
fd를 수정합니다. - epoll.unregister(fd) — epoll 객체에서 등록된 파일 디스크립터를 제거합니다.
versionchanged: 3.9에서 이 메서드는 더 이상 EBADF 오류를 무시하지 않습니다.
- epoll.poll(timeout=None, maxevents=-1) — 이벤트를 대기합니다.
timeout은 초 단위(float).versionchanged: 3.5에서 함수는
InterruptedError를 발생시키는 대신 시그널에 의해 중단되면 재계산된 타임아웃으로 재시도됩니다(시그널 핸들러가 예외를 발생시키지 않는 한, 근거는 PEP 475 참고).
폴링 객체
대부분의 Unix 시스템에서 지원되는 poll() 시스템 호출은 동시에 아주 많은 클라이언트를 서비스하는 네트워크 서버에 더 나은 확장성을 제공합니다. poll()은 시스템 호출이 관심 있는 파일 디스크립터만 나열하면 되는 반면, select()는 비트맵을 만들고 관심 있는 fd의 비트를 켠 후 전체 비트맵을 다시 선형으로 스캔해야 하므로 확장성이 더 좋습니다. select()는 O(가장 높은 파일 디스크립터)이고 poll()은 O(파일 디스크립터 수)입니다.
- poll.register(fd[, eventmask]) — 폴링 객체에 파일 디스크립터를 등록합니다. 이후
poll()메서드 호출은 파일 디스크립터에 대기 중인 I/O 이벤트가 있는지 확인합니다.fd는 정수이거나 정수를 반환하는fileno()메서드를 가진 객체일 수 있습니다. 파일 객체는fileno()를 구현하므로 인자로도 사용할 수 있습니다.eventmask는 확인하려는 이벤트 유형을 설명하는 선택적 비트마스크이며, 아래 표에 설명된POLLIN,POLLPRI,POLLOUT상수의 조합일 수 있습니다. 지정되지 않으면 사용되는 기본값은 세 가지 유형의 이벤트를 모두 확인합니다. | 상수 | 의미 | |------|------| | POLLIN | 읽을 데이터가 있음. | | POLLPRI | 읽을 긴급 데이터가 있음. | | POLLOUT | 출력 준비: 쓰기가 블록되지 않음. | | POLLERR | 어떤 종류의 오류 조건. | | POLLHUP | 중단됨. | | POLLRDHUP | 스트림 소켓 피어가 연결을 닫았거나 연결의 쓰기 절반을 종료함. | | POLLNVAL | 잘못된 요청: 디스크립터가 열려 있지 않음. |- 이미 등록된 파일 디스크립터를 등록하는 것은 오류가 아니며 디스크립터를 정확히 한 번 등록하는 것과 같은 효과가 있습니다.
- poll.modify(fd, eventmask) — 이미 등록된
fd를 수정합니다.register(fd, eventmask)와 같은 효과가 있습니다. 등록된 적이 없는 파일 디스크립터를 수정하려는 시도는 errnoENOENT로OSError예외를 발생시킵니다. - poll.unregister(fd) — 폴링 객체가 추적하는 파일 디스크립터를 제거합니다.
register()메서드와 마찬가지로fd는 정수이거나 정수를 반환하는fileno()메서드를 가진 객체일 수 있습니다.- 등록된 적이 없는 파일 디스크립터를 제거하려는 시도는
KeyError예외를 발생시킵니다.
- 등록된 적이 없는 파일 디스크립터를 제거하려는 시도는
- poll.poll([timeout]) — 등록된 파일 디스크립터 집합을 폴링하고 보고할 이벤트나 오류가 있는 디스크립터에 대해
(fd, event)2-튜플을 포함하는, 아마도 빈 목록을 반환합니다.fd는 파일 디스크립터이고event는 해당 디스크립터에 대해 보고된 이벤트에 대해 비트가 설정된 비트마스크입니다 — 대기 입력은POLLIN, 디스크립터에 쓸 수 있음을 나타내려면POLLOUT등입니다. 빈 목록은 호출이 타임아웃되고 파일 디스크립터에 보고할 이벤트가 없었음을 나타냅니다.timeout이 주어지면 시스템이 반환하기 전에 이벤트를 기다릴 시간(밀리초)을 지정합니다.timeout이 생략되거나, 음수이거나,None이면 이 poll 객체에 대한 이벤트가 있을 때까지 호출이 블록합니다.-
versionchanged: 3.5에서 함수는
InterruptedError를 발생시키는 대신 시그널에 의해 중단되면 재계산된 타임아웃으로 재시도됩니다(시그널 핸들러가 예외를 발생시키지 않는 한, 근거는 PEP 475 참고).
-
Kqueue 객체
- kqueue.close() — kqueue 객체의 제어 파일 디스크립터를 닫습니다.
- kqueue.closed — kqueue 객체가 닫히면
True. - kqueue.fileno() — 제어 fd의 파일 디스크립터 번호를 반환합니다.
- kqueue.fromfd(fd) — 주어진 파일 디스크립터에서 kqueue 객체를 만듭니다.
- kqueue.control(changelist, max_events[, timeout]) → eventlist — kevent에 대한 저수준 인터페이스.
changelist는 kevent 객체의 iterable이거나None이어야 합니다.max_events는 0 또는 양의 정수여야 합니다.timeout은 초 단위(float 가능). 기본값은None으로 영원히 기다립니다.-
versionchanged: 3.5에서 함수는
InterruptedError를 발생시키는 대신 시그널에 의해 중단되면 재계산된 타임아웃으로 재시도됩니다(시그널 핸들러가 예외를 발생시키지 않는 한, 근거는 PEP 475 참고).
Kevent 객체
https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
- kevent.ident — 이벤트를 식별하는 데 사용되는 값. 해석은 필터에 따라 다르지만 보통 파일 디스크립터입니다. 생성자에서
ident는int이거나fileno()메서드를 가진 객체일 수 있습니다. kevent는 정수를 내부적으로 저장합니다. - kevent.filter — 커널 필터의 이름. | 상수 | 의미 | |------|------| | KQ_FILTER_READ | 디스크립터를 받고 읽을 수 있는 데이터가 있을 때마다 반환. | | KQ_FILTER_WRITE | 디스크립터를 받고 쓸 수 있는 데이터가 있을 때마다 반환. | | KQ_FILTER_AIO | AIO 요청. | | KQ_FILTER_VNODE | fflag에서 감시하는 요청된 이벤트 중 하나 이상이 발생하면 반환. | | KQ_FILTER_PROC | 프로세스 ID의 이벤트 감시. | | KQ_FILTER_NETDEV | 네트워크 장치의 이벤트 감시(macOS에서는 사용 불가). | | KQ_FILTER_SIGNAL | 감시하는 시그널이 프로세스에 전달될 때마다 반환. | | KQ_FILTER_TIMER | 임의 타이머 설정. |
- kevent.flags — 필터 동작. | 상수 | 의미 | |------|------| | KQ_EV_ADD | 이벤트 추가 또는 수정. | | KQ_EV_DELETE | 큐에서 이벤트 제거. | | KQ_EV_ENABLE | control()이 이벤트를 반환하도록 허용. | | KQ_EV_DISABLE | 이벤트 비활성화. | | KQ_EV_ONESHOT | 첫 발생 후 이벤트 제거. | | KQ_EV_CLEAR | 이벤트가 검색된 후 상태 재설정. | | KQ_EV_SYSFLAGS | 내부 이벤트. | | KQ_EV_FLAG1 | 내부 이벤트. | | KQ_EV_EOF | 필터별 EOF 조건. | | KQ_EV_ERROR | 반환 값 참고. |
- kevent.fflags — 필터별 플래그.
KQ_FILTER_READ및KQ_FILTER_WRITE필터 플래그:KQ_NOTE_LOWAT(소켓 버퍼의 낮은 워터마크).KQ_FILTER_VNODE필터 플래그:KQ_NOTE_DELETE(unlink() 호출됨),KQ_NOTE_WRITE(쓰기 발생),KQ_NOTE_EXTEND(파일 확장됨),KQ_NOTE_ATTRIB(속성 변경됨),KQ_NOTE_LINK(링크 수 변경됨),KQ_NOTE_RENAME(파일 이름 변경됨),KQ_NOTE_REVOKE(파일 접근이 취소됨).KQ_FILTER_PROC필터 플래그:KQ_NOTE_EXIT(프로세스 종료됨),KQ_NOTE_FORK(프로세스가 fork() 호출함),KQ_NOTE_EXEC(프로세스가 새 프로세스 실행함),KQ_NOTE_PCTRLMASK(내부 필터 플래그),KQ_NOTE_PDATAMASK(내부 필터 플래그),KQ_NOTE_TRACK(fork()를 가로질러 프로세스 추적),KQ_NOTE_CHILD(NOTE_TRACK에 대해 자식 프로세스에서 반환),KQ_NOTE_TRACKERR(자식에 연결할 수 없음).KQ_FILTER_NETDEV필터 플래그(macOS에서는 사용 불가):KQ_NOTE_LINKUP(링크가 켜짐),KQ_NOTE_LINKDOWN(링크가 꺼짐),KQ_NOTE_LINKINV(링크 상태가 유효하지 않음).
- kevent.data — 필터별 데이터.
- kevent.udata — 사용자 정의 값.