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