POSIX 시스템에서 프로세스가 종료되기를 기다리는 데 사용되는 바쁜 루프 폴링 방식은 비효율적이었습니다. 이 방법은 프로세스 상태를 확인하기 위해 CPU를 끊임없이 깨우므로 사이클을 낭비하고 지연 시간을 증가시킵니다. 이 글에서는 이벤트 기반 대기를 더 나은 대안으로 소개합니다. Linux 시스템은 커널 5.3부터 `pidfd_open`을 지원하여 `select`, `poll` 또는 `epoll`이 프로세스 PID를 효율적으로 모니터링할 수 있도록 합니다. 이를 통해 커널이 대상 프로세스가 종료되거나 타임아웃이 발생할 때만 프로세스를 깨우므로 바쁜 루프를 제거합니다. BSD 및 macOS 시스템은 유사한 이벤트 기반 프로세스 모니터링을 위해 `kqueue` 시스템 호출을 사용합니다. Windows는 이미 `WaitForSingleObject`를 사용하여 효율적인 이벤트 기반 방식을 사용하고 있습니다. 새로운 구현은 이벤트 기반 메커니즘이 실패할 경우 바쁜 루프 방식으로 우아하게 대체됩니다. 측정 결과 이벤트 기반 방식에서 컨텍스트 스위칭이 크게 감소한 것으로 나타났습니다. `poll`과 `kqueue` 모두 프로세스를 CPU를 전혀 사용하지 않는 효율적인 절전 상태로 만듭니다. 이 개선 사항은 처음에 `psutil`에 구현되었으며, 이제 15년 이상 만에 `psutil`에서 Python 표준 라이브러리 `subprocess` 모듈로 기여되었습니다.
gmpy.dev
Giampaolo Rodola: From Python 3.3 to today: ending 15 years of subprocess polling
