2021년 11월 21일 일요일

python sleep() 사용법, 밀리초 정지

 python에서 sleep 사용하는 방법은 아래와 같습니다.


time.sleep(초단위 시간)


그래서 기본적인 예제는 아래와 같습니다. 

2초 동안 아무런 동작을 하지 않는 예제입니다.

import time


time.sleep(2)


1초 이하의 시간을 입력하려면 어떻게 하면 될까요?

아래는 0.1초 sleep의 예제 입니다.

import time


time.sleep(0.1)

참 쉽습니다.


한가지 알아야 하는 내용이 있는데 0.00001초를 sleep을 해도 성능에 따라 해당 초 이상을 좀 더 sleep을 할 수도 있습니다. 이말은 다시말해 정확하게 0.00001초를 sleep할 수 없다는 의미입니다.


sleep간 시간이 얼마나 지났는지 알 수 있는 예제

import time
import datetime

nowtime = datetime.datetime.now()

time.sleep(0.0001)

print(datetime.datetime.now()-nowtime)


실행 결과

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.009972

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.008974

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.008015

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.011967

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.001994

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.006980

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.015920

C:\Users\USER\Documents\sourcecode\python\example>_sleep.py
0:00:00.011968


여러번 실행시킨 결과는 최소 0.008초를 sleep 하였습니다. 0.001 초를 sleep해도 최소 0.008초를 sleep하게 된다는 의미입니다. (이 결과는 PC성능에 따라 다를 수 있습니다.)


그런데 python doc을 보던중에 흥미로운 사실이 있었습니다.

time.sleep(secs)

주어진 초 동안 호출하는 스레드의 실행을 일시 중단합니다. 인자는 더 정확한 수면 시간을 나타내는 부동 소수점 숫자일 수 있습니다. 포착된 시그널이 해당 시그널의 포착 루틴을 실행한 후 sleep()을 종료하기 때문에 실제 정지 시간은 요청된 것보다 짧을 수 있습니다. 또한, 정지 시간은 시스템 내의 다른 활동의 스케줄링으로 인해 임의의 양만큼 요청된 것보다 길 수 있습니다.

버전 3.5에서 변경: 시그널 처리기가 예외를 발생시키는 경우를 제외하고, 시그널에 의해 휴면이 중단되더라도 이 함수는 이제 최소한 secs 동안 휴면합니다 (근거는 PEP 475를 참조하십시오).


파란색 내용인데 정지 시간이 요청된것 보다 짧을 수 있다라는 말인데 이 부분은 어떤 의미인지 잘 모르겠습니다.

3.5버전에서 최종적으로 정리가 한번 더 되어있는데 예외 상황을 제외하고는 최소한 주어진 secs 동안(여기에서 secs는 단순 초를 의미하는게 아니라 sleep()함수 입력 인자 secs를 의미 합니다.) 휴면한다고 합니다.


댓글 없음:

댓글 쓰기