본문 바로가기

Study/CS

[python] time.sleep을 잘 써야하는 이유

오늘은 파이썬에서 많이 쓰는 time.sleep에 대해서 알아보려고 한다

이유는.. 회사에서 내가 저걸 막 쓰다가 코드를 다시 짰기 때문에.. ㅎㅎ

 

우선

구현 상황은 이랬다

이렇게 deque 내에 데이터들이 담겨있고, 각 데이터에는 timestamp가 존재한다

이 데이터들을 rabbitmq에 각 timestamp 간격에 맞춰서 쏴줘야 하는데, 이걸 구현하기 위해서 나는 데이터를 하나 쏜 후에 다음 데이터까지의 timestamp 간격만큼 time.sleep을 집어넣었다

그런데 코드를 다 짜고 테스트를 해보니까 실제로 sleep한 시간이 timestamp 간의 간격보다
길어서 데이터들 간의 싱크가 맞지 않는 것이 아닌가?

회사에서 다루는 대부분의 데이터가 실시간 데이터였기에 데이터 싱크가 맞지 않는 문제는 허용할 수 있는 이슈가 아니었기 때문에 원인을 분석해보니 무심코 썼던 time.sleep에 정답이 있었다

 

프로세스를 sleep 한다는 것의 의미

우선 python의 time 모듈의 공식 문서에 나와있는 sleep() 함수에 대한 설명을 살펴보자

쉬운 설명을 위해서 한국어로 번역해서 캡처했다

여기서 주목해야 할 점은

"시스템의 다른 활동 일정으로 인해 정지 시간은 요청한 시간보다 임의의 양만큼 길어질 수 있습니다"

라는 부분이다.

 

왜 그럴까?

답은 프로세스의 상태 큐에 있다

 

프로그램이 OS로부터 PCB와 VMS를 할당받으면 프로세스가 되고, 이 프로세스가 CPU를 할당받기 전까지
대기 상태로 대기 큐에 추가되게 된다

 

여러 CPU 스케쥴링 정책에 의해서 한 프로세스가 CPU를 할당받고,
time.sleep()에 의해서 1초를 쉰다면
프로세스는 대기 상태로 돌아온 후에

1초를 쉬고 다시 대기 큐로 합류한다

이렇게 되면, 이미 대기 큐에 있는 다른 프로세스들이 있기 때문에
OS에 스케쥴링에 의해서 자기 차례가 오기 전까지는
프로세스가 실행되지 않는다

그래서 1초보다 더 많은 시간이 소요될 수 있는 것이다

 

이러한 이유로 나는 time.sleep()을 쓰지않고 rabbitmq의 플러그인 중 하나인 delayed를 이용해서 해결했다

이 내용에 대해서는 추후 포스팅으로 다시 작성해볼 예정이다!!

덕분에 컴퓨터 내부의 프로세스의 상태에 대해서 제대로 공부할 수 있는 계기가 된 것 같다

'Study > CS' 카테고리의 다른 글

[Python OOP] Python에서의 객체(Object)와 타입 힌트  (2) 2024.01.22
[Python] easydict 사용하기  (0) 2024.01.19