Python os.eventfd()로 이벤트 알림 다루기 — 카운터 누적부터 poll 이벤트 루프 깨우기까지
스레드 간, 또는 프로세스 간에 "무슨 일이 일어났다"는 신호 하나만 가볍게 보내고 싶을 때 파이프나 소켓은 다소 과하다. eventfd는 커널이 관리하는 64비트 정수 카운터 하나를 파일 디스크립터로 노출해서, select/poll/epoll 같은…
파이썬 사용법, Python programming
스레드 간, 또는 프로세스 간에 "무슨 일이 일어났다"는 신호 하나만 가볍게 보내고 싶을 때 파이프나 소켓은 다소 과하다. eventfd는 커널이 관리하는 64비트 정수 카운터 하나를 파일 디스크립터로 노출해서, select/poll/epoll 같은…
PID 기반 프로세스 관리(os.kill(pid, sig), os.waitpid(pid, ...))에는 근본적인 문제가 있다. PID는 재사용된다. 어떤 프로세스가 죽고 그 PID가 회수되면, 커널은 그 번호를 완전히 다른 새 프로세스에 다시 배정할 수 있다. 자식…
특정 디렉터리에 새 파일이 생기거나 로그 파일이 갱신될 때마다 즉시 반응해야 하는 스크립트를 짤 때, 가장 손쉬운 방법은 os.listdir()이나 파일의 mtime을 주기적으로 비교하는 폴링(polling)이다. 하지만 폴링 주기를 짧게 잡으면 CPU를…
서버 상태를 점검할 때 uname -a, free -h, df -h, ip addr를 하나씩 따로 실행하고 눈으로 훑어보는 방식은 서버가 한두 대일 때는 문제없지만, 배포 전 자동 점검이나 정기 헬스체크처럼 반복적으로…
서버 여러 대의 상태를 순차적으로 점검하는 스크립트를 짜본 적이 있다면 익숙한 문제가 있다. 호스트 10대를 ping으로 확인하는 데 각각 1초가 걸린다면, for 루프로 하나씩 처리할 경우 전체 실행 시간은 10초에…
ps, top, htop 같은 도구는 어떻게 실행 중인 모든 프로세스의 상태와 메모리 사용량을 실시간으로 보여줄까. 답은 의외로 단순한데, 이 도구들은 별도의 커널 API를 호출하는 게 아니라 /proc 아래의 파일들을 읽어서…
파이썬으로 시스템 프로그래밍을 하다 보면 표준 라이브러리에 없는 저수준 기능이 필요한 순간이 온다. 특정 syscall을 직접 호출해야 하거나, 이미 검증된 C 라이브러리(.so)를 재사용하고 싶거나, 순수 파이썬으로는 느린 연산을 C로 짜둔…
Python 스크립트에서 셸 명령어나 외부 프로그램을 호출해야 하는 상황은 흔하다. os.system()은 출력을 캡처할 수 없고, os.popen()은 에러 처리와 스트림 제어가 번거롭다. 특히 자동화 스크립트에서 외부 명령의 표준출력/표준에러를 각각 받아 로그로…
수백만 행짜리 데이터프레임을 통째로 훑어보거나 모델에 넣기 전에, 일부만 빠르게 뽑아 분포를 확인하고 싶을 때가 있다. df.head()는 앞부분만 보여주기 때문에 데이터가 정렬돼 있으면 편향된 인상을 준다. 반대로 그룹별 비율은 유지한…
데이터를 받으면 가장 먼저 하게 되는 작업이 값의 분포를 파악하는 것이다. Pandas는 평균을 구하는 mean(), 고유값을 뽑는 unique(), 값별 개수를 세는 value_counts() 같은 통계 함수를 기본으로 제공한다. 이 글에서는 예제…