이벤트루프 (event loop, 메시지 디스패칭 message dispatching)
프로그램의 중앙에 위치한 제어 흐름이다. 어떤 메시지가 큐에 들어가면 이벤트 루프가 큐에서 메시지를 꺼내 적절한 함수로 전달.
가장 많이 사용되는 이벤트 소스는 I/O이다.
그러나, I/O는 본질적으로 블로킹 작업이기 때문에 프로그램 실행 속도가 느려진다.
이런 문제를 해결하기 위해 비동기 모드(asyncronous mode)소켓을 사용해서 문제를 해결해본다.
단순히 소켓을 비동기모드로 설정하여도, 서버는 여전히 5초 지연 후에 응답을 보낼 것이다.
따라서, socket의 recv를 호출했을 때, 소켓은 읽을 데이터가 없다. 따라서 BlockingIOError가 발생한다.
이 문제를 해결하기 위해서 select를 사용하여, 데이터가 들어오면 즉시 읽을 수 있도록 처리한다.
import socket
import select
s = socket.create_connection(("httpbin.org", 80))
s.setblocking(False)
s.send(b"GET /delay/5 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n")
# ready_to_read에 읽을 값이 들어올 때까지 계속 반복문
while True:
# ready_to_read : 읽기 준비상태 여부. 블로킹 없이 소켓에 읽을 수 있는 데이터가 들어오면 바로 읽기 가능
ready_to_read, ready_to_write, in_error = select.select([s], [], [])
if s in ready_to_read:
buf = s.recv(1024)
print(buf)
break
NGINX나 Node.js 등의 매우 빠른 HTTP서버에서 기반 기술로 사용 중이다.
한번에 수천개의 연결을 처리해야하는 프로그램의 핵심요소이다.
'Developer > Python' 카테고리의 다른 글
Python 문자열 활용 : isdigit isalpha isalnum (0) | 2021.02.15 |
---|---|
[Python] collections 모듈 Counter 클래스 사용하기 (0) | 2021.01.31 |
[Python] Python에서 fpdf 사용하기 (0) | 2021.01.05 |
[Python] 딕셔너리 키 값 존재여부 확인 (0) | 2021.01.04 |
[Python] 파이썬 이벤트 루프 (0) | 2020.12.29 |