select — 스트림 집합에서 이벤트 대기

이 모듈은 단일 객체에서 바쁜 대기(busy-waiting)나 차단을 하는 대신, 하나 이상의 스트림 (소켓, UART 및 기타 I/O 객체와 같이 스트림 프로토콜을 구현하는 파일류 객체)이 읽기 또는 쓰기 준비가 될 때까지 효율적으로 대기하는 함수를 제공합니다.

poll 객체가 권장되는 인터페이스입니다. 이는 많은 스트림으로 확장 가능하며 poll.ipoll() 을 통해 사용할 때 할당이 없습니다. 모듈 수준의 select() 함수는 효율이 떨어지는 호환성 인터페이스입니다.

poll 객체를 사용하는 예제:

import select

poller = select.poll()
poller.register(uart, select.POLLIN)

while True:
    # Wait up to 1000 ms for the UART to have data.
    for obj, event in poller.poll(1000):
        if event & select.POLLIN:
            print(obj.read())

모듈 수준의 select() 함수를 사용하는 예제:

import select

# Wait up to 1 second for the socket to become readable.
rlist, wlist, xlist = select.select([sock], [], [], 1.0)
if rlist:
    data = sock.recv(100)

함수

select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]

주어진 스트림 객체 중 하나 이상이 준비될 때까지, 또는 timeout 이 만료될 때까지 대기합니다.

  • rlist 는 읽기 가능 여부를 모니터링할 객체의 목록입니다.

  • wlist 는 쓰기 가능 여부를 모니터링할 객체의 목록입니다.

  • xlist 는 오류 또는 행업(hang-up) 조건을 모니터링할 객체의 목록입니다.

  • timeout 은 대기할 최대 시간(초 단위이며 float도 허용됨)입니다. 생략되거나 None 이면 호출이 무기한 차단되고, 0 이면 즉시 반환됩니다(비차단 폴링).

목록의 3-튜플 (rlist, wlist, xlist) 를 반환합니다. 반환된 각 목록은 각각 읽기 준비, 쓰기 준비가 되었거나 오류/행업을 신호한 객체를 포함하는, 해당 입력 목록의 부분집합입니다. timeout 이 경과했는데 아무것도 준비되지 않았으면 세 목록 모두 비어 있습니다.

이 함수는 poll 보다 효율이 떨어집니다(매 호출마다 내부 폴 집합을 다시 구성함). 가능하면 대신 poll 을 사용하세요.

상수

select.POLLIN: int

스트림에서 읽을 데이터가 있습니다.

select.POLLOUT: int

스트림이 더 많은 데이터의 쓰기를 받아들일 수 있습니다.

select.POLLERR: int

스트림에서 오류 조건이 발생했습니다. 이것은 비요청(unsolicited) 이벤트입니다. eventmask 에 요청되지 않았더라도 poll.poll() / poll.ipoll() 에 의해 보고되며, 입력 eventmask 로 전달하는 것은 유효하지 않습니다.

select.POLLHUP: int

스트림이 행업/연결 해제되었습니다. 이것은 비요청(unsolicited) 이벤트입니다. eventmask 에 요청되지 않았더라도 poll.poll() / poll.ipoll() 에 의해 보고되며, 입력 eventmask 로 전달하는 것은 유효하지 않습니다.

클래스

class select.poll

등록된 스트림 집합(또는 스트림 프로토콜을 노출하는 임의의 객체)을 유지하고, 그 중 하나 이상이 읽기 가능, 쓰기 가능 상태가 되거나 예외 조건을 신호할 때까지 효율적으로 대기하는 폴링 객체를 만듭니다.

스트림은 register() 로 추가하고 unregister() 로 제거하며, 감시할 이벤트 집합은 modify() 로 변경할 수 있습니다. 구성이 완료되면 무언가 준비될 때까지(또는 타임아웃이 경과할 때까지) 차단하려면 poll() 을, 할당이 없는 반복자 기반 변형을 원하면 ipoll() 을 호출하세요.

register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None

eventmask(다음 값들의 논리 OR)로 지정된 이벤트를 감시하면서, 폴링을 위해 stream obj를 등록합니다:

eventmask 의 기본값은 select.POLLIN | select.POLLOUT 입니다.

select.POLLHUPselect.POLLERR 는 입력 eventmask 에서 유효하지 않습니다. 이것들은 요청 여부와 관계없이 poll() / ipoll() 에 의해 보고되는 비요청 이벤트입니다(이는 POSIX 의미론과 일치합니다).

동일한 obj 에 대해 이 메서드를 두 번 이상 호출해도 괜찮습니다. 후속 호출은 obj 의 이벤트 마스크를 업데이트하며, modify() 처럼 동작합니다.

unregister(obj: Any) None

등록된 스트림 집합에서 obj 를 제거합니다. 현재 등록되지 않은 obj 의 등록을 해제하는 것은 오류가 아닙니다(이 경우 호출은 아무 효과가 없습니다).

modify(obj: Any, eventmask: int) None

이미 등록된 obj 의 이벤트 마스크를 eventmask 로 변경합니다. obj 가 등록되지 않은 경우 errno.ENOENT 와 함께 OSError 를 발생시킵니다.

poll(timeout: int = -1, /) List[Tuple]

등록된 스트림 중 적어도 하나가 준비되거나 예외 조건을 신호할 때까지 차단한 다음, 발생한 스트림의 목록을 반환합니다.

timeout 은 대기할 최대 시간(밀리초 단위)입니다. 생략되거나 -1 이면 호출이 무기한 차단되고, 0 이면 즉시 반환됩니다(비차단 폴링).

발생한 스트림마다 하나씩, (obj, event, ...) 튜플의 목록을 반환합니다. obj 는 등록된 스트림이고 event 는 발생한 select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP 플래그의 비트 OR입니다. 각 튜플에는 구현에 따라 정의되는 추가 요소가 포함될 수 있으므로 길이가 정확히 2라고 가정하지 마세요. timeout 이 경과했는데 아무것도 준비되지 않았으면 빈 목록이 반환됩니다.

select.POLLHUPselect.POLLERR 는 (요청되지 않았더라도) 언제든지 반환될 수 있으며 반드시 처리해야 합니다. 일반적으로 해당 스트림의 등록을 해제하고 닫아야 하며, 그렇지 않으면 후속 호출이 해당 스트림에 대해 이 플래그가 설정된 채로 계속 즉시 반환됩니다.

대기 중인 예약된 콜백은 폴링 루프에 진입하기 전에 반드시 실행됨이 보장됩니다.

CPython과의 차이점

위에서 설명한 대로, 반환되는 튜플에는 2개를 초과하는 요소가 포함될 수 있습니다.

ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]

poll() 과 유사하지만, 목록을 만드는 대신 한 번에 하나의 (obj, event, ...) 튜플을 산출하는 반복자를 반환합니다. 이는 매 호출마다 할당하는 것을 피하며, 이는 비동기 I/O 스케줄러에 중요합니다.

산출되는 튜플은 호출 수신자 소유(callee-owned) 입니다. 다음 반복에서 재사용(덮어쓰기)되므로 그 내용은 루프 본문 내에서 소비되어야 하며 그것에 대한 참조를 저장해서는 안 됩니다.

timeoutpoll() 에서와 동일한 의미를 갖습니다. flags1 이면 일회성(one-shot) 동작이 사용됩니다. 이벤트가 발생한 스트림은 이벤트 마스크가 자동으로 지워지므로(poll.modify(obj, 0) 과 동등함), modify() 로 마스크가 다시 설정될 때까지 해당 스트림에 대한 추가 이벤트가 보고되지 않습니다.

대기 중인 예약된 콜백은 폴링 루프에 진입하기 전에 반드시 실행됨이 보장됩니다.

CPython과의 차이점

이 메서드는 MicroPython 확장입니다.