요약: 상세요약: 기존 로직은 다음과 같이 단순하지만 비효율적이었습니다: 이 방식은 다음과 같은 3가지 치명적인 단점이 있습니다. 2. 해결책: POSIX 시스템을 위한 이벤트 기반 대기 (Event-driven Waiting) 3. 성능 개선 및 결과 /usr/bin/time -v 등을 통해 벤치마킹한 결과, 기존 방식 대비 불필요한 컨텍스트 스위칭(Context Switching)이 획기적으로 감소했으며, 프로세스 종료 감지 속도 또한 즉각적으로 개선되었습니다. 이 업데이트는 psutil 라이브러리와 CPython 코어에 반영되어, 향후 Python 개발자들은 별도의 코드 수정 없이 성능 향상 혜택을 누릴 수 있게 되었습니다.
1. 15년 동안 지속된 문제: Busy-loop 폴링
Python 3.3에서 subprocess.Popen.wait()에 timeout 파라미터가 추가된 이래로, Python 표준 라이브러리와 널리 쓰이는 psutil 라이브러리는 프로세스 종료를 기다리기 위해 비효율적인 방식을 사용해왔습니다.
# 기존 방식 (개념 코드)
import time, os
def wait_busy(pid, timeout):
delay = 0.0001
while True:
# 프로세스 종료 여부 확인 (polling)
if os.waitpid(pid, os.WNOHANG) == (pid, status):
return status
time.sleep(delay)
delay = min(delay * 2, 0.040) # 최대 40ms까지 대기 시간 증가
모든 POSIX 시스템은 파일 디스크립터(File Descriptor)의 상태 변화를 감지하는 메커니즘(select, poll, epoll, kqueue)을 제공합니다. 최근 Python과 psutil은 이를 프로세스 PID 감지에 활용하는 방식으로 개선되었습니다.
이 변화를 통해 wait() 호출 시 프로세스는 커널 입장에서 'Interruptible sleep' 상태가 됩니다. 즉, CPU를 전혀 소모하지 않고 커널 공간에서 조용히 대기하다가, 프로세스 종료 시그널이 발생하면 즉시 깨어납니다.

1 week ago
8










English (US) ·