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.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를 등록합니다:
select.POLLIN– 읽을 데이터가 있음select.POLLOUT– 스트림이 더 많은 쓰기 데이터를 받아들일 수 있음
eventmask 의 기본값은
select.POLLIN | select.POLLOUT입니다.select.POLLHUP과select.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.POLLHUP과select.POLLERR는 (요청되지 않았더라도) 언제든지 반환될 수 있으며 반드시 처리해야 합니다. 일반적으로 해당 스트림의 등록을 해제하고 닫아야 하며, 그렇지 않으면 후속 호출이 해당 스트림에 대해 이 플래그가 설정된 채로 계속 즉시 반환됩니다.대기 중인 예약된 콜백은 폴링 루프에 진입하기 전에 반드시 실행됨이 보장됩니다.
CPython과의 차이점
위에서 설명한 대로, 반환되는 튜플에는 2개를 초과하는 요소가 포함될 수 있습니다.
- ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]¶
poll()과 유사하지만, 목록을 만드는 대신 한 번에 하나의(obj, event, ...)튜플을 산출하는 반복자를 반환합니다. 이는 매 호출마다 할당하는 것을 피하며, 이는 비동기 I/O 스케줄러에 중요합니다.산출되는 튜플은 호출 수신자 소유(callee-owned) 입니다. 다음 반복에서 재사용(덮어쓰기)되므로 그 내용은 루프 본문 내에서 소비되어야 하며 그것에 대한 참조를 저장해서는 안 됩니다.
timeout 은
poll()에서와 동일한 의미를 갖습니다. flags 가1이면 일회성(one-shot) 동작이 사용됩니다. 이벤트가 발생한 스트림은 이벤트 마스크가 자동으로 지워지므로(poll.modify(obj, 0)과 동등함),modify()로 마스크가 다시 설정될 때까지 해당 스트림에 대한 추가 이벤트가 보고되지 않습니다.대기 중인 예약된 콜백은 폴링 루프에 진입하기 전에 반드시 실행됨이 보장됩니다.
CPython과의 차이점
이 메서드는 MicroPython 확장입니다.